exiftool_vendored 11.71.0 → 11.75.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +39 -0
  3. data/bin/MANIFEST +17 -4
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +23 -26
  7. data/bin/config_files/convert_regions.config +139 -5
  8. data/bin/exiftool +21 -21
  9. data/bin/fmt_files/gpx.fmt +2 -1
  10. data/bin/fmt_files/gpx_wpt.fmt +2 -1
  11. data/bin/fmt_files/kml.fmt +2 -2
  12. data/bin/fmt_files/kml_track.fmt +46 -0
  13. data/bin/lib/Image/ExifTool.pm +42 -33
  14. data/bin/lib/Image/ExifTool.pod +21 -21
  15. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +2 -2
  16. data/bin/lib/Image/ExifTool/Canon.pm +2 -1
  17. data/bin/lib/Image/ExifTool/CanonCustom.pm +30 -4
  18. data/bin/lib/Image/ExifTool/Exif.pm +36 -63
  19. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
  20. data/bin/lib/Image/ExifTool/Lang/ru.pm +4233 -503
  21. data/bin/lib/Image/ExifTool/MakerNotes.pm +6 -12
  22. data/bin/lib/Image/ExifTool/Nikon.pm +2 -1
  23. data/bin/lib/Image/ExifTool/Olympus.pm +2 -1
  24. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  25. data/bin/lib/Image/ExifTool/Parrot.pm +751 -0
  26. data/bin/lib/Image/ExifTool/Photoshop.pm +12 -11
  27. data/bin/lib/Image/ExifTool/QuickTime.pm +18 -5
  28. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +316 -44
  29. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -2
  30. data/bin/lib/Image/ExifTool/Sigma.pm +72 -55
  31. data/bin/lib/Image/ExifTool/TagLookup.pm +73 -7
  32. data/bin/lib/Image/ExifTool/TagNames.pod +249 -18
  33. data/bin/lib/Image/ExifTool/Text.pm +160 -0
  34. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -2
  35. data/bin/lib/Image/ExifTool/Writer.pl +1 -1
  36. data/bin/lib/Image/ExifTool/XMP.pm +19 -26
  37. data/bin/lib/Image/ExifTool/XMP2.pl +46 -9
  38. data/bin/lib/Image/ExifTool/XMPStruct.pl +14 -4
  39. data/bin/perl-Image-ExifTool.spec +19 -19
  40. data/lib/exiftool_vendored/version.rb +1 -1
  41. metadata +6 -7
  42. data/bin/config_files/blueskysea.config +0 -101
  43. data/bin/config_files/dji.config +0 -131
  44. data/bin/config_files/mini0806.config +0 -99
  45. data/bin/config_files/thinkware.config +0 -144
@@ -974,21 +974,15 @@ my $debug; # set to 1 to enable debugging code
974
974
  },
975
975
  {
976
976
  Name => 'MakerNoteSigma',
977
- # (starts with "SIGMA\0")
978
- Condition => '$$self{Make}=~/^(SIGMA|FOVEON)/ and $$valPt!~/^SIGMA\0\0\0\0\x03/',
979
- SubDirectory => {
980
- TagTable => 'Image::ExifTool::Sigma::Main',
981
- Validate => '$val =~ /^(SIGMA|FOVEON)/',
982
- Start => '$valuePtr + 10',
983
- ByteOrder => 'Unknown',
977
+ Condition => q{
978
+ return undef unless $$self{Make}=~/^(SIGMA|FOVEON)/;
979
+ # save version number in "MakerNoteSigmaVer" member variable
980
+ $$self{MakerNoteSigmaVer} = $$valPt=~/^SIGMA\0\0\0\0(.)/ ? ord($1) : -1;
981
+ return 1;
984
982
  },
985
- },
986
- {
987
- Name => 'MakerNoteSigma3',
988
- # (starts with "SIGMA\0\0\0\0\x03")
989
- Condition => '$$valPt=~/^SIGMA\0\0\0\0\x03/ and $$self{MakerNoteSigma3}=1',
990
983
  SubDirectory => {
991
984
  TagTable => 'Image::ExifTool::Sigma::Main',
985
+ Validate => '$val =~ /^(SIGMA|FOVEON)/',
992
986
  Start => '$valuePtr + 10',
993
987
  ByteOrder => 'Unknown',
994
988
  },
@@ -61,7 +61,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
61
61
  use Image::ExifTool::Exif;
62
62
  use Image::ExifTool::GPS;
63
63
 
64
- $VERSION = '3.72';
64
+ $VERSION = '3.73';
65
65
 
66
66
  sub LensIDConv($$$);
67
67
  sub ProcessNikonAVI($$$);
@@ -4484,6 +4484,7 @@ my %nikonFocalConversions = (
4484
4484
  1 => 'Nikkor Z 24-70mm f/4 S',
4485
4485
  2 => 'Nikkor Z 14-30mm f/4 S',
4486
4486
  4 => 'Nikkor Z 35mm f/1.8 S',
4487
+ 8 => 'Nikkor Z 58mm f/0.95 S Noct', #IB
4487
4488
  9 => 'Nikkor Z 50mm f/1.8 S',
4488
4489
  11 => 'Nikkor Z DX 16-50mm f/3.5-6.3 VR',
4489
4490
  12 => 'Nikkor Z DX 50-250mm f/4.5-6.3 VR',
@@ -39,7 +39,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
39
39
  use Image::ExifTool::Exif;
40
40
  use Image::ExifTool::APP12;
41
41
 
42
- $VERSION = '2.60';
42
+ $VERSION = '2.61';
43
43
 
44
44
  sub PrintLensInfo($$$);
45
45
 
@@ -409,6 +409,7 @@ my %olympusCameraTypes = (
409
409
  S0068 => 'E-M10MarkIII',
410
410
  S0076 => 'E-PL9', #IB
411
411
  S0080 => 'E-M1X', #IB
412
+ S0089 => 'E-M5MarkIII',
412
413
  SR45 => 'D220',
413
414
  SR55 => 'D320L',
414
415
  SR83 => 'D340L',
@@ -197,7 +197,7 @@ sub ProcessEXR($$)
197
197
  $name = 'Invalid';
198
198
  }
199
199
  }
200
- $tagInfo = { Name => $name, WasAdded => 1 };
200
+ $tagInfo = { Name => $name };
201
201
  AddTagToTable($tagTablePtr, $tag, $tagInfo);
202
202
  $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
203
203
  }
@@ -0,0 +1,751 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: Parrot.pm
3
+ #
4
+ # Description: Read timed metadata from Parrot drone videos
5
+ #
6
+ # Revisions: 2019-10-23 - P. Harvey Created
7
+ #
8
+ # References: 1) https://developer.parrot.com/docs/pdraw/metadata.html
9
+ #------------------------------------------------------------------------------
10
+
11
+ package Image::ExifTool::Parrot;
12
+
13
+ use strict;
14
+ use vars qw($VERSION);
15
+
16
+ $VERSION = '1.00';
17
+
18
+ sub Process_mett($$$);
19
+
20
+ # tags found in Parrot 'mett' timed metadata (ref 1)
21
+ %Image::ExifTool::Parrot::mett = (
22
+ PROCESS_PROC => \&Process_mett,
23
+ # put the 'P' records first in the documentation
24
+ VARS => { SORT_PROC => sub { my ($a,$b)=@_; $a=~s/P/A/; $b=~s/P/A/; $a cmp $b } },
25
+ NOTES => q{
26
+ Streaming metadata found in Parrot drone videos. See
27
+ L<https://developer.parrot.com/docs/pdraw/metadata.html> for the
28
+ specification.
29
+ },
30
+ P1 => {
31
+ Name => 'ParrotV1',
32
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::V1' },
33
+ },
34
+ P2 => {
35
+ Name => 'ParrotV2',
36
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::V2' },
37
+ },
38
+ P3 => {
39
+ Name => 'ParrotV3',
40
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::V3' },
41
+ },
42
+ E1 => {
43
+ Name => 'ParrotTimeStamp',
44
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::TimeStamp' },
45
+ },
46
+ E2 => {
47
+ Name => 'ParrotFollowMe',
48
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::FollowMe' },
49
+ },
50
+ E3 => {
51
+ Name => 'ParrotAutomation',
52
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::Automation' },
53
+ },
54
+ );
55
+
56
+ # tags found in the Parrot 'mett' V1 timed metadata (ref 1) [untested]
57
+ %Image::ExifTool::Parrot::V1 = (
58
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
59
+ NOTES => 'Parrot version 1 streaming metadata.',
60
+ GROUPS => { 2 => 'Location' },
61
+ 4 => {
62
+ Name => 'DroneYaw',
63
+ Format => 'int16s',
64
+ ValueConv => '$val / 0x1000 * 180 / 3.14159', # convert from rad to deg
65
+ },
66
+ 6 => {
67
+ Name => 'DronePitch',
68
+ Format => 'int16s',
69
+ ValueConv => '$val / 0x1000 * 180 / 3.14159',
70
+ },
71
+ 8 => {
72
+ Name => 'DroneRoll',
73
+ Format => 'int16s',
74
+ ValueConv => '$val / 0x1000 * 180 / 3.14159',
75
+ },
76
+ 10 => {
77
+ Name => 'CameraPan',
78
+ Format => 'int16s',
79
+ ValueConv => '$val / 0x1000 * 180 / 3.14159',
80
+ },
81
+ 12 => {
82
+ Name => 'CameraTilt',
83
+ Format => 'int16s',
84
+ ValueConv => '$val / 0x1000 * 180 / 3.14159',
85
+ },
86
+ 14 => {
87
+ Name => 'FrameView', # (W,X,Y,Z)
88
+ Format => 'int16s[4]',
89
+ ValueConv => 'my @a = split " ",$val; $_ /= 0x1000 foreach @a; "@a"',
90
+ },
91
+ 22 => {
92
+ Name => 'ExposureTime',
93
+ Groups => { 2 => 'Camera' },
94
+ Format => 'int16s',
95
+ ValueConv => '$val / 0x100 / 1000',
96
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
97
+ },
98
+ 24 => {
99
+ Name => 'ISO',
100
+ Groups => { 2 => 'Camera' },
101
+ Format => 'int16s',
102
+ },
103
+ 26 => {
104
+ Name => 'WifiRSSI',
105
+ Groups => { 2 => 'Device' },
106
+ Format => 'int8s',
107
+ PrintConv => '"$val dBm"',
108
+ },
109
+ 27 => {
110
+ Name => 'Battery',
111
+ Groups => { 2 => 'Device' },
112
+ PrintConv => '"$val %"',
113
+ },
114
+ 28 => {
115
+ Name => 'GPSLatitude',
116
+ Format => 'int32s',
117
+ ValueConv => '$val / 0x100000',
118
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
119
+ },
120
+ 32 => {
121
+ Name => 'GPSLongitude',
122
+ Format => 'int32s',
123
+ ValueConv => '$val / 0x100000',
124
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
125
+ },
126
+ 36 => {
127
+ Name => 'GPSAltitude',
128
+ Format => 'int32s',
129
+ Mask => 0xffffff00,
130
+ ValueConv => '$val / 0x100',
131
+ PrintConv => 'sprintf("%.3f m", $val)',
132
+ },
133
+ 36.1 => {
134
+ Name => 'GPSSatellites', # (SV count)
135
+ Format => 'int32s',
136
+ Mask => 0xff,
137
+ },
138
+ 40 => {
139
+ Name => 'AltitudeFromTakeOff',
140
+ Format => 'int32s',
141
+ ValueConv => '$val / 0x10000',
142
+ PrintConv => 'sprintf("%.3f m", $val)',
143
+ },
144
+ 44 => {
145
+ Name => 'DistanceFromHome',
146
+ Format => 'int32u',
147
+ ValueConv => '$val / 0x10000',
148
+ },
149
+ 48 => {
150
+ Name => 'SpeedX',
151
+ Format => 'int16s',
152
+ ValueConv => '$val / 0x100',
153
+ },
154
+ 50 => {
155
+ Name => 'SpeedY',
156
+ Format => 'int16s',
157
+ ValueConv => '$val / 0x100',
158
+ },
159
+ 52 => {
160
+ Name => 'SpeedZ',
161
+ Format => 'int16s',
162
+ ValueConv => '$val / 0x100',
163
+ },
164
+ 54 => {
165
+ Name => 'Binning',
166
+ Groups => { 2 => 'Device' },
167
+ Mask => 0x80,
168
+ },
169
+ 54.1 => {
170
+ Name => 'FlyingState',
171
+ Groups => { 2 => 'Device' },
172
+ Mask => 0x7f,
173
+ PrintConv => {
174
+ 0 => 'Landed',
175
+ 1 => 'Taking Off',
176
+ 2 => 'Hovering',
177
+ 3 => 'Flying',
178
+ 4 => 'Landing',
179
+ 5 => 'Emergency',
180
+ },
181
+ },
182
+ 55 => {
183
+ Name => 'Animation',
184
+ Groups => { 2 => 'Device' },
185
+ Mask => 0x80,
186
+ },
187
+ 55.1 => {
188
+ Name => 'PilotingMode',
189
+ Groups => { 2 => 'Device' },
190
+ Mask => 0x7f,
191
+ PrintConv => {
192
+ 0 => 'Manual',
193
+ 1 => 'Return Home',
194
+ 2 => 'Flight Plan',
195
+ 3 => 'Follow Me',
196
+ },
197
+ },
198
+ );
199
+
200
+ # tags found in the Parrot 'mett' V2 timed metadata (ref 1) [untested]
201
+ %Image::ExifTool::Parrot::V2 = (
202
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
203
+ Groups => { 2 => 'Location' },
204
+ NOTES => 'Parrot version 2 basic streaming metadata.',
205
+ 4 => {
206
+ Name => 'Elevation',
207
+ Notes => 'estimated distance from ground',
208
+ Format => 'int32s',
209
+ ValueConv => '$val / 0x10000',
210
+ PrintConv => 'sprintf("%.3f m", $val)',
211
+ },
212
+ 8 => {
213
+ Name => 'GPSLatitude',
214
+ Format => 'int32s',
215
+ ValueConv => '$val / 0x400000',
216
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
217
+ },
218
+ 12 => {
219
+ Name => 'GPSLongitude',
220
+ Format => 'int32s',
221
+ ValueConv => '$val / 0x400000',
222
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
223
+ },
224
+ 16 => {
225
+ Name => 'GPSAltitude',
226
+ Format => 'int32s',
227
+ Mask => 0xffffff00,
228
+ ValueConv => '$val / 0x100',
229
+ PrintConv => 'sprintf("%.3f m", $val)',
230
+ },
231
+ 16.1 => {
232
+ Name => 'GPSSatellites', # (SV count)
233
+ Format => 'int32s',
234
+ Mask => 0xff,
235
+ },
236
+ 20 => {
237
+ Name => 'GPSVelocityNorth', # (m/s)
238
+ Format => 'int16s',
239
+ ValueConv => '$val / 0x100',
240
+ },
241
+ 22 => {
242
+ Name => 'GPSVelocityEast', # (m/s)
243
+ Format => 'int16s',
244
+ ValueConv => '$val / 0x100',
245
+ },
246
+ 24 => {
247
+ Name => 'GPSVelocityDown', # (m/s)
248
+ Format => 'int16s',
249
+ ValueConv => '$val / 0x100',
250
+ },
251
+ 26 => {
252
+ Name => 'AirSpeed', # (m/s)
253
+ Format => 'int16s',
254
+ RawConv => '$val < 0 ? undef : $val',
255
+ ValueConv => '$val / 0x100',
256
+ },
257
+ 28 => {
258
+ Name => 'DroneQuaternion', # (W,X,Y,Z)
259
+ Format => 'int16s[4]',
260
+ ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"',
261
+ },
262
+ 36 => {
263
+ Name => 'FrameView', # (W,X,Y,Z)
264
+ Format => 'int16s[4]',
265
+ ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"',
266
+ },
267
+ 44 => {
268
+ Name => 'CameraPan',
269
+ Format => 'int16s',
270
+ ValueConv => '$val / 0x1000 * 180 / 3.14159', # convert from rad to deg
271
+ },
272
+ 46 => {
273
+ Name => 'CameraTilt',
274
+ Format => 'int16s',
275
+ ValueConv => '$val / 0x1000 * 180 / 3.14159',
276
+ },
277
+ 48 => {
278
+ Name => 'ExposureTime',
279
+ Groups => { 2 => 'Camera' },
280
+ Format => 'int16u',
281
+ ValueConv => '$val / 0x100 / 1000',
282
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
283
+ },
284
+ 50 => {
285
+ Name => 'ISO',
286
+ Groups => { 2 => 'Camera' },
287
+ Format => 'int16u',
288
+ },
289
+ 52 => {
290
+ Name => 'Binning',
291
+ Groups => { 2 => 'Device' },
292
+ Mask => 0x80,
293
+ },
294
+ 52.1 => {
295
+ Name => 'FlyingState',
296
+ Groups => { 2 => 'Device' },
297
+ Mask => 0x7f,
298
+ PrintConv => {
299
+ 0 => 'Landed',
300
+ 1 => 'Taking Off',
301
+ 2 => 'Hovering',
302
+ 3 => 'Flying',
303
+ 4 => 'Landing',
304
+ 5 => 'Emergency',
305
+ 6 => 'User Takeoff',
306
+ 7 => 'Motor Ramping',
307
+ 8 => 'Emergency Landing',
308
+ },
309
+ },
310
+ 53 => {
311
+ Name => 'Animation',
312
+ Groups => { 2 => 'Device' },
313
+ Mask => 0x80,
314
+ },
315
+ 53.1 => {
316
+ Name => 'PilotingMode',
317
+ Groups => { 2 => 'Device' },
318
+ Mask => 0x7f,
319
+ PrintConv => {
320
+ 0 => 'Manual',
321
+ 1 => 'Return Home',
322
+ 2 => 'Flight Plan',
323
+ 3 => 'Follow Me / Tracking', # (same as 'Tracking')
324
+ 4 => 'Magic Carpet',
325
+ 5 => 'Move To',
326
+ },
327
+ },
328
+ 54 => {
329
+ Name => 'WifiRSSI',
330
+ Groups => { 2 => 'Device' },
331
+ Format => 'int8s',
332
+ PrintConv => '"$val dBm"',
333
+ },
334
+ 55 => {
335
+ Name => 'Battery',
336
+ Groups => { 2 => 'Device' },
337
+ PrintConv => '"$val %"',
338
+ },
339
+ );
340
+
341
+ # tags found in the Parrot 'mett' V3 timed metadata (ref 1)
342
+ %Image::ExifTool::Parrot::V3 = (
343
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
344
+ GROUPS => { 2 => 'Location' },
345
+ NOTES => 'Parrot version 3 basic streaming metadata.',
346
+ 4 => {
347
+ Name => 'Elevation',
348
+ Notes => 'estimated distance from ground',
349
+ Format => 'int32s',
350
+ ValueConv => '$val / 0x10000',
351
+ PrintConv => 'sprintf("%.3f m", $val)',
352
+ },
353
+ 8 => {
354
+ Name => 'GPSLatitude',
355
+ Format => 'int32s',
356
+ ValueConv => '$val / 0x400000',
357
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
358
+ },
359
+ 12 => {
360
+ Name => 'GPSLongitude',
361
+ Format => 'int32s',
362
+ ValueConv => '$val / 0x400000',
363
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
364
+ },
365
+ 16 => {
366
+ Name => 'GPSAltitude',
367
+ Format => 'int32s',
368
+ Mask => 0xffffff00,
369
+ ValueConv => '$val / 0x100',
370
+ PrintConv => 'sprintf("%.3f m", $val)',
371
+ },
372
+ 16.1 => {
373
+ Name => 'GPSSatellites', # (SV count)
374
+ Format => 'int32s',
375
+ Mask => 0xff,
376
+ },
377
+ 20 => {
378
+ Name => 'GPSVelocityNorth', # (m/s)
379
+ Format => 'int16s',
380
+ ValueConv => '$val / 0x100',
381
+ },
382
+ 22 => {
383
+ Name => 'GPSVelocityEast', # (m/s)
384
+ Format => 'int16s',
385
+ ValueConv => '$val / 0x100',
386
+ },
387
+ 24 => {
388
+ Name => 'GPSVelocityDown', # (m/s)
389
+ Format => 'int16s',
390
+ ValueConv => '$val / 0x100',
391
+ },
392
+ 26 => {
393
+ Name => 'AirSpeed', # (m/s)
394
+ Format => 'int16s',
395
+ RawConv => '$val < 0 ? undef : $val',
396
+ ValueConv => '$val / 0x100',
397
+ },
398
+ 28 => {
399
+ Name => 'DroneQuaternion', # (W,X,Y,Z)
400
+ Format => 'int16s[4]',
401
+ ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"',
402
+ },
403
+ 36 => {
404
+ Name => 'FrameBaseView', # (W,X,Y,Z without pan/tilt)
405
+ Format => 'int16s[4]',
406
+ ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"',
407
+ },
408
+ 44 => {
409
+ Name => 'FrameView', # (W,X,Y,Z)
410
+ Format => 'int16s[4]',
411
+ ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"',
412
+ },
413
+ 52 => {
414
+ Name => 'ExposureTime',
415
+ Groups => { 2 => 'Camera' },
416
+ Format => 'int16u',
417
+ ValueConv => '$val / 0x100 / 1000',
418
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
419
+ },
420
+ 54 => {
421
+ Name => 'ISO',
422
+ Groups => { 2 => 'Camera' },
423
+ Format => 'int16u',
424
+ },
425
+ 56 => {
426
+ Name => 'RedBalance',
427
+ Groups => { 2 => 'Camera' },
428
+ Format => 'int16u',
429
+ ValueConv => '$val / 0x4000',
430
+ },
431
+ 58 => {
432
+ Name => 'BlueBalance',
433
+ Groups => { 2 => 'Camera' },
434
+ Format => 'int16u',
435
+ ValueConv => '$val / 0x4000',
436
+ },
437
+ 60 => {
438
+ Name => 'FOV', # (degrees)
439
+ Description => 'Field Of View',
440
+ Notes => 'horizontal and vertical field of view in degrees',
441
+ Groups => { 2 => 'Image' },
442
+ Format => 'int16u[2]',
443
+ ValueConv => 'my @a = split " ",$val; $_ /= 0x100 foreach @a; "@a"',
444
+ },
445
+ 64 => {
446
+ Name => 'LinkGoodput',
447
+ Groups => { 2 => 'Device' },
448
+ Format => 'int32u',
449
+ Mask => 0xffffff00,
450
+ PrintConv => '"$val kbit/s"',
451
+ },
452
+ 64.1 => {
453
+ Name => 'LinkQuality',
454
+ Groups => { 2 => 'Device' },
455
+ Format => 'int32u',
456
+ Notes => '0-5',
457
+ Mask => 0xff,
458
+ },
459
+ 68 => {
460
+ Name => 'WifiRSSI',
461
+ Groups => { 2 => 'Device' },
462
+ Format => 'int8s',
463
+ PrintConv => '"$val dBm"',
464
+ },
465
+ 69 => {
466
+ Name => 'Battery',
467
+ Groups => { 2 => 'Device' },
468
+ PrintConv => '"$val %"',
469
+ },
470
+ 70 => {
471
+ Name => 'Binning',
472
+ Groups => { 2 => 'Device' },
473
+ Mask => 0x80,
474
+ },
475
+ 70.1 => {
476
+ Name => 'FlyingState',
477
+ Groups => { 2 => 'Device' },
478
+ Mask => 0x7f,
479
+ PrintConv => {
480
+ 0 => 'Landed',
481
+ 1 => 'Taking Off',
482
+ 2 => 'Hovering',
483
+ 3 => 'Flying',
484
+ 4 => 'Landing',
485
+ 5 => 'Emergency',
486
+ 6 => 'User Takeoff',
487
+ 7 => 'Motor Ramping',
488
+ 8 => 'Emergency Landing',
489
+ },
490
+ },
491
+ 71 => {
492
+ Name => 'Animation',
493
+ Groups => { 2 => 'Device' },
494
+ Mask => 0x80,
495
+ },
496
+ 71.1 => {
497
+ Name => 'PilotingMode',
498
+ Groups => { 2 => 'Device' },
499
+ Mask => 0x7f,
500
+ PrintConv => {
501
+ 0 => 'Manual',
502
+ 1 => 'Return Home',
503
+ 2 => 'Flight Plan',
504
+ 3 => 'Follow Me / Tracking', # (same as 'Tracking')
505
+ 4 => 'Magic Carpet',
506
+ 5 => 'Move To',
507
+ },
508
+ },
509
+ );
510
+
511
+ # tags found in the Parrot 'mett' E1 timestamp timed metadata (ref 1)
512
+ %Image::ExifTool::Parrot::TimeStamp = (
513
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
514
+ NOTES => 'Parrot streaming metadata timestamp extension.',
515
+ GROUPS => { 2 => 'Time' },
516
+ 4 => {
517
+ Name => 'TimeStamp',
518
+ Format => 'int64u',
519
+ ValueConv => '$val / 1e6',
520
+ },
521
+ );
522
+
523
+ # tags found in the Parrot 'mett' E2 follow-me timed metadata (ref 1) [untested]
524
+ %Image::ExifTool::Parrot::FollowMe = (
525
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
526
+ GROUPS => { 2 => 'Location' },
527
+ NOTES => 'Parrot streaming metadata follow-me extension.',
528
+ 4 => {
529
+ Name => 'GPSTargetLatitude',
530
+ Format => 'int32s',
531
+ ValueConv => '$val / 0x400000',
532
+ },
533
+ 8 => {
534
+ Name => 'GPSTargetLongitude',
535
+ Format => 'int32s',
536
+ ValueConv => '$val / 0x400000',
537
+ },
538
+ 12 => {
539
+ Name => 'GPSTargetAltitude',
540
+ Format => 'int32s',
541
+ ValueConv => '$val / 0x10000',
542
+ },
543
+ 16 => {
544
+ Name => 'Follow-meMode',
545
+ Groups => { 2 => 'Device' },
546
+ PrintConv => { BITMASK => {
547
+ 0 => 'Follow-me enabled',
548
+ 1 => 'Follow-me', # (0=Look-at-me! auggh. see AutomationFlags below)
549
+ 2 => 'Angle locked',
550
+ }},
551
+ },
552
+ 17 => {
553
+ Name => 'Follow-meAnimation',
554
+ Groups => { 2 => 'Device' },
555
+ PrintConv => {
556
+ 0 => 'None',
557
+ 1 => 'Orbit',
558
+ 2 => 'Boomerang',
559
+ 3 => 'Parabola',
560
+ 4 => 'Zenith',
561
+ },
562
+ },
563
+ );
564
+
565
+ # tags found in the Parrot 'mett' E3 automation timed metadata (ref 1)
566
+ %Image::ExifTool::Parrot::Automation = (
567
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
568
+ GROUPS => { 2 => 'Location' },
569
+ NOTES => 'Parrot streaming metadata automation extension.',
570
+ 4 => {
571
+ Name => 'GPSFramingLatitude',
572
+ Format => 'int32s',
573
+ ValueConv => '$val / 0x400000',
574
+ },
575
+ 8 => {
576
+ Name => 'GPSFramingLongitude',
577
+ Format => 'int32s',
578
+ ValueConv => '$val / 0x400000',
579
+ },
580
+ 12 => {
581
+ Name => 'GPSFramingAltitude',
582
+ Format => 'int32s',
583
+ ValueConv => '$val / 0x10000',
584
+ },
585
+ 16 => {
586
+ Name => 'GPSDestLatitude',
587
+ Format => 'int32s',
588
+ ValueConv => '$val / 0x400000',
589
+ },
590
+ 20 => {
591
+ Name => 'GPSDestLongitude',
592
+ Format => 'int32s',
593
+ ValueConv => '$val / 0x400000',
594
+ },
595
+ 24 => {
596
+ Name => 'GPSDestAltitude',
597
+ Format => 'int32s',
598
+ ValueConv => '$val / 0x10000',
599
+ },
600
+ 28 => {
601
+ Name => 'AutomationAnimation',
602
+ Groups => { 2 => 'Device' },
603
+ PrintConv => {
604
+ 0 => 'None',
605
+ 1 => 'Orbit',
606
+ 2 => 'Boomerang',
607
+ 3 => 'Parabola',
608
+ 4 => 'Dolly Slide',
609
+ 5 => 'Dolly Zoom',
610
+ 6 => 'Reveal Vertical',
611
+ 7 => 'Reveal Horizontal',
612
+ 8 => 'Candle',
613
+ 9 => 'Flip Front',
614
+ 10 => 'Flip Back',
615
+ 11 => 'Flip Left',
616
+ 12 => 'Flip Right',
617
+ 13 => 'Twist Up',
618
+ 14 => 'Position Twist Up',
619
+ },
620
+ },
621
+ 29 => {
622
+ Name => 'AutomationFlags',
623
+ Groups => { 2 => 'Device' },
624
+ PrintConv => { BITMASK => {
625
+ 0 => 'Follow-me enabled',
626
+ 1 => 'Look-at-me enabled', # (really? opposite sense to Follow-meMode above!)
627
+ 2 => 'Angle locked',
628
+ }},
629
+ },
630
+ );
631
+
632
+ %Image::ExifTool::Parrot::Composite = (
633
+ GPSDateTime => {
634
+ Description => 'GPS Date/Time',
635
+ Groups => { 2 => 'Time' },
636
+ SubDoc => 1,
637
+ Require => {
638
+ 0 => 'Parrot:GPSLatitude', # (avoids creating this tag for other videos)
639
+ 1 => 'Main:CreateDate',
640
+ 2 => 'SampleTime',
641
+ },
642
+ ValueConv => q{
643
+ my $time = $val[1];
644
+ my $diff = $val[2];
645
+ # handle time zone and shift to UTC
646
+ if ($time =~ s/([-+])(\d{1,2}):?(\d{2})$//) {
647
+ my $secs = (($2 * 60) + $3) * 60;
648
+ $secs *= -1 if $1 eq '+';
649
+ $diff += $secs;
650
+ } elsif ($time !~ s/Z$//) {
651
+ # shift from local time
652
+ $diff += GetUnixTime($time, 1) - GetUnixTime($time);
653
+ }
654
+ my $sign = ($diff =~ s/^-// ? '-' : '');
655
+ $time .= '.000'; # add decimal seconds
656
+ ShiftTime($time, "${sign}0:0:$diff");
657
+ return $time . 'Z';
658
+ },
659
+ PrintConv => '$self->ConvertDateTime($val)',
660
+ },
661
+ );
662
+
663
+ # add our composite tags
664
+ Image::ExifTool::AddCompositeTags('Image::ExifTool::Parrot');
665
+
666
+
667
+ #------------------------------------------------------------------------------
668
+ # Parse Parrot 'mett' timed metadata
669
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
670
+ # Returns: 1 on success
671
+ # (this metadata design is really stupid -- you need to know the size of the base structures)
672
+ sub Process_mett($$$)
673
+ {
674
+ my ($et, $dirInfo, $tagTbl) = @_;
675
+ my $dataPt = $$dirInfo{DataPt};
676
+ my $dataPos = $$dirInfo{DataPos};
677
+ my $dirEnd = length $$dataPt;
678
+ my $pos = $$dirInfo{DirStart} || 0;
679
+
680
+ $et->VerboseDir('Parrot mett', undef, $dirEnd);
681
+
682
+ while ($pos + 4 < $dirEnd) {
683
+ my ($id, $nwords) = unpack("x${pos}a2n", $$dataPt);
684
+ my $size;
685
+ if ($id !~ /^[EP]\d/) {
686
+ # no ID so this should be a 60-byte V1 recording record, otherwise give up
687
+ last unless $dirEnd == 60;
688
+ $id = 'P1'; # generate a fake ID
689
+ # ignore the first 4 of the record so the fields will align with
690
+ # the other V1 records (unfortunately, this means that we won't
691
+ # decode the V1 recording frame timestamp, but oh well)
692
+ $pos += 4;
693
+ $size = $dirEnd - $pos;
694
+ # must override size for P3 and P3 records since it includes the extensions (augh!)
695
+ } elsif ($id eq 'P2') {
696
+ $size = 56;
697
+ } elsif ($id eq 'P3') {
698
+ $size = 72;
699
+ } else {
700
+ $size = $nwords * 4 + 4;
701
+ }
702
+ last if $pos + $size > $dirEnd;
703
+ $et->HandleTag($tagTbl, $id, undef,
704
+ DataPt => $dataPt,
705
+ DataPos => $dataPos,
706
+ Start => $pos,
707
+ Size => $size,
708
+ );
709
+ $pos += $size;
710
+ }
711
+ return 1;
712
+ }
713
+
714
+ 1; # end
715
+
716
+ __END__
717
+
718
+ =head1 NAME
719
+
720
+ Image::ExifTool::Parrot - Read timed metadata from Parrot drone videos
721
+
722
+ =head1 SYNOPSIS
723
+
724
+ This module is loaded automatically by Image::ExifTool when required.
725
+
726
+ =head1 DESCRIPTION
727
+
728
+ This module contains definitions required by Image::ExifTool to interpret
729
+ timed metadata from the 'mett' frame found in Parrot drone MP4 videos.
730
+
731
+ =head1 AUTHOR
732
+
733
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
734
+
735
+ This library is free software; you can redistribute it and/or modify it
736
+ under the same terms as Perl itself.
737
+
738
+ =head1 REFERENCES
739
+
740
+ =over 4
741
+
742
+ =item L<https://developer.parrot.com/docs/pdraw/metadata.html>
743
+
744
+ =back
745
+
746
+ =head1 SEE ALSO
747
+
748
+ L<Image::ExifTool::TagNames/Parrot Tags>,
749
+ L<Image::ExifTool(3pm)|Image::ExifTool>
750
+
751
+ =cut