exiftool-vendored.exe 13.35.1 → 13.37.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 (70) hide show
  1. package/bin/exiftool.exe +0 -0
  2. package/bin/exiftool_files/exiftool.pl +1 -1
  3. package/bin/exiftool_files/lib/Image/ExifTool/Audible.pm +1 -1
  4. package/bin/exiftool_files/lib/Image/ExifTool/BMP.pm +1 -1
  5. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +15 -8
  6. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +1 -1
  7. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +59 -5
  8. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +1 -1
  9. package/bin/exiftool_files/lib/Image/ExifTool/CaptureOne.pm +1 -1
  10. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +5 -5
  11. package/bin/exiftool_files/lib/Image/ExifTool/DV.pm +1 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +3 -2
  13. package/bin/exiftool_files/lib/Image/ExifTool/FLIF.pm +1 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +3 -3
  15. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +5 -4
  17. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +1 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/GM.pm +1 -1
  19. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
  20. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.pm +3 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +10 -2
  22. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +5 -5
  23. package/bin/exiftool_files/lib/Image/ExifTool/Google.pm +804 -0
  24. package/bin/exiftool_files/lib/Image/ExifTool/H264.pm +1 -1
  25. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  26. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +3 -3
  27. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +1 -1
  28. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +1 -1
  29. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +1 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +2 -2
  31. package/bin/exiftool_files/lib/Image/ExifTool/Lytro.pm +1 -1
  32. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +2 -2
  33. package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +1 -1
  34. package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -1
  35. package/bin/exiftool_files/lib/Image/ExifTool/MXF.pm +1 -1
  36. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +2 -2
  37. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +30 -7
  38. package/bin/exiftool_files/lib/Image/ExifTool/Microsoft.pm +4 -4
  39. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +6 -5
  40. package/bin/exiftool_files/lib/Image/ExifTool/OOXML.pm +1 -1
  41. package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +1 -1
  42. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +2 -1
  43. package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +1 -1
  44. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +1 -1
  45. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +19 -7
  46. package/bin/exiftool_files/lib/Image/ExifTool/Protobuf.pm +12 -6
  47. package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +2 -2
  48. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +30 -8
  49. package/bin/exiftool_files/lib/Image/ExifTool/README +7 -6
  50. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +5 -3
  51. package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +1 -1
  52. package/bin/exiftool_files/lib/Image/ExifTool/Reconyx.pm +375 -91
  53. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +1 -1
  54. package/bin/exiftool_files/lib/Image/ExifTool/Shortcuts.pm +8 -5
  55. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +20 -3
  56. package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +3 -2
  57. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +5745 -5695
  58. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +662 -509
  59. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +1 -1
  60. package/bin/exiftool_files/lib/Image/ExifTool/Trailer.pm +1 -1
  61. package/bin/exiftool_files/lib/Image/ExifTool/WPG.pm +1 -1
  62. package/bin/exiftool_files/lib/Image/ExifTool/WTV.pm +1 -1
  63. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +31 -30
  64. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +0 -482
  65. package/bin/exiftool_files/lib/Image/ExifTool/ZIP.pm +1 -1
  66. package/bin/exiftool_files/lib/Image/ExifTool/iWork.pm +1 -1
  67. package/bin/exiftool_files/lib/Image/ExifTool.pm +4 -4
  68. package/bin/exiftool_files/lib/Image/ExifTool.pod +3 -3
  69. package/bin/exiftool_files/windows_exiftool.txt +1 -1
  70. package/package.json +3 -3
@@ -211,12 +211,13 @@ key:
211
211
  an ID_LABEL of "Index" is assumed for tables which use
212
212
  ProcessBinaryData or set the IS_BINARY flag.
213
213
 
214
- NO_ID Avoid printing "Tag ID" column in tag name documentation.
215
-
216
- HEX_ID Print tag ID in hexadecimal (with 4 hex digits or more). Set
217
- to 0 for string ID's that look like hex numbers to prevent
218
- them from being converted when importing an XML file for
219
- language translations in BuildLangModules().
214
+ ID_FMT Format for tag ID's in the documentation. Setting is 'hex' to
215
+ print tag ID in hexadecimal (with 4 hex digits or more), 'dec'
216
+ to leave as decimal, 'str' to use a quoted string, or 'none'
217
+ to drop the "Tag ID" column entirely. Any setting other than
218
+ 'hex' prevents hex-looking strings from being converted when
219
+ importing an XML file for language translations in
220
+ BuildLangModules().
220
221
 
221
222
  NO_LOOKUP Do not add tags to TagLookup.pm lookup tables.
222
223
 
@@ -30,7 +30,7 @@ use strict;
30
30
  use vars qw($VERSION $AUTOLOAD);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
 
33
- $VERSION = '1.71';
33
+ $VERSION = '1.72';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -2031,6 +2031,7 @@ sub ProcessRIFF($$)
2031
2031
  my $validate = $et->Options('Validate');
2032
2032
  my $ee = $et->Options('ExtractEmbedded');
2033
2033
  my $hash = $$et{ImageDataHash};
2034
+ my $base = 0;
2034
2035
 
2035
2036
  # verify this is a valid RIFF file
2036
2037
  return 0 unless $raf->Read($buff, 12) == 12;
@@ -2042,7 +2043,8 @@ sub ProcessRIFF($$)
2042
2043
  return 0 unless $buff =~ /^(LA0[234]|OFR |LPAC|wvpk)/ and $raf->Read($buf2, 1024);
2043
2044
  $type = $riffType{$1};
2044
2045
  $buff .= $buf2;
2045
- return 0 unless $buff =~ /WAVE(.{4})?fmt /sg and $raf->Seek(pos($buff) - 4, 0);
2046
+ return 0 unless $buff =~ /WAVE(.{4})?(junk|fmt )/sg and $raf->Seek(pos($buff) - 4, 0);
2047
+ $base = pos($buff) - 16;
2046
2048
  }
2047
2049
  $$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode
2048
2050
  $mime = $riffMimeType{$type} if $type;
@@ -2159,7 +2161,7 @@ sub ProcessRIFF($$)
2159
2161
  DataPos => 0, # (relative to Base)
2160
2162
  Start => 0,
2161
2163
  Size => $len,
2162
- Base => $pos,
2164
+ Base => $pos + $base,
2163
2165
  );
2164
2166
  if ($setGroups) {
2165
2167
  delete $$et{SET_GROUP0};
@@ -22,7 +22,7 @@ my $implementedRawzorVersion = 199; # (up to version 1.99)
22
22
  # Rawzor-specific tags
23
23
  %Image::ExifTool::Rawzor::Main = (
24
24
  GROUPS => { 2 => 'Other' },
25
- VARS => { NO_ID => 1 },
25
+ VARS => { ID_FMT => 'none' },
26
26
  NOTES => q{
27
27
  Rawzor files store compressed images of other formats. As well as the
28
28
  information listed below, exiftool uncompresses and extracts the meta
@@ -8,6 +8,7 @@
8
8
  # References: 1) RCNX_MN10.pdf (courtesy of Reconyx Inc.)
9
9
  # 2) ultrafire_makernote.pdf (courtesy of Reconyx Inc.)
10
10
  # 3) Reconyx private communication
11
+ # 4) "Reconyx Metadata 1_4.pdf"
11
12
  #------------------------------------------------------------------------------
12
13
 
13
14
  package Image::ExifTool::Reconyx;
@@ -15,20 +16,56 @@ package Image::ExifTool::Reconyx;
15
16
  use strict;
16
17
  use vars qw($VERSION);
17
18
 
18
- $VERSION = '1.06';
19
+ $VERSION = '1.07';
19
20
 
20
21
  # info for Type2 version tags
21
22
  my %versionInfo = (
22
23
  Format => 'undef[7]',
23
- ValueConv => 'sprintf("V%.2x.%.2x %.4x:%.2x:%.2x Rev.%s", unpack("CCvCCa", $val))',
24
+ ValueConv => 'sprintf("%.2x.%.2x %.4x:%.2x:%.2x Rev.%s", unpack("CCvCCa", $val))',
24
25
  ValueConvInv => q{
25
- my @v = $val =~ /^V([0-9a-f]+)\.([0-9a-f]+) (\d{4}):(\d{2}):(\d{2})\s*Rev\.(\w)/i or return undef;
26
+ my @v = $val =~ /^([0-9a-f]+)\.([0-9a-f]+) (\d{4}):(\d{2}):(\d{2})\s*Rev\.(\w)/i or return undef;
26
27
  pack('CCvCCa', map(hex, @v[0..4]), $v[5]);
27
28
  },
28
29
  );
29
30
 
30
- # maker notes for Reconyx Hyperfire cameras (ref PH)
31
- %Image::ExifTool::Reconyx::Main = (
31
+ my %moonPhase = (
32
+ 0 => 'New',
33
+ 1 => 'New Crescent',
34
+ 2 => 'First Quarter',
35
+ 3 => 'Waxing Gibbous',
36
+ 4 => 'Full',
37
+ 5 => 'Waning Gibbous',
38
+ 6 => 'Last Quarter',
39
+ 7 => 'Old Crescent',
40
+ );
41
+
42
+ my %sunday0 = (
43
+ 0 => 'Sunday',
44
+ 1 => 'Monday',
45
+ 2 => 'Tuesday',
46
+ 3 => 'Wednesday',
47
+ 4 => 'Thursday',
48
+ 5 => 'Friday',
49
+ 6 => 'Saturday',
50
+ );
51
+
52
+ my %sunday1 = (
53
+ 1 => 'Sunday',
54
+ 2 => 'Monday',
55
+ 3 => 'Tuesday',
56
+ 4 => 'Wednesday',
57
+ 5 => 'Thursday',
58
+ 6 => 'Friday',
59
+ 7 => 'Saturday',
60
+ );
61
+
62
+ my %convUnicode = (
63
+ ValueConv => '$self->Decode($val, "UCS2", "II")',
64
+ ValueConvInv => '$self->Encode($val, "UCS2", "II")',
65
+ );
66
+
67
+ # maker notes for Reconyx HyperFire cameras (ref PH)
68
+ %Image::ExifTool::Reconyx::HyperFire = (
32
69
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
33
70
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
34
71
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
@@ -38,20 +75,20 @@ my %versionInfo = (
38
75
  WRITABLE => 1,
39
76
  FIRST_ENTRY => 0,
40
77
  NOTES => q{
41
- The following tags are extracted from the maker notes of Reconyx Hyperfire
42
- cameras such as the HC500, HC600 and PC900.
78
+ The following tags are extracted from the maker notes of Reconyx RapidFire
79
+ and HyperFire models such as the HC500, HC600 and PC900.
43
80
  },
44
81
  0x00 => { #1
45
82
  Name => 'MakerNoteVersion',
46
- PrintConv => 'sprintf("0x%.4x", $val)',
47
83
  Writable => 0, # (we use this for identification, 0xf101 --> rev 1.0)
84
+ PrintConv => 'sprintf("0x%.4x", $val)',
48
85
  PrintConvInv => 'hex $val',
49
86
  },
50
87
  0x01 => { #1
51
88
  Name => 'FirmwareVersion',
52
89
  Format => 'int16u[3]',
53
- PrintConv => '$val=~tr/ /./; $val',
54
90
  Writable => 0, # (we use this for identification, 0x0003 --> ver 2 or 3)
91
+ PrintConv => '$val=~tr/ /./; $val',
55
92
  },
56
93
  0x04 => { #1
57
94
  Name => 'FirmwareDate',
@@ -113,16 +150,7 @@ my %versionInfo = (
113
150
  0x12 => {
114
151
  Name => 'MoonPhase',
115
152
  Groups => { 2 => 'Time' },
116
- PrintConv => {
117
- 0 => 'New',
118
- 1 => 'New Crescent',
119
- 2 => 'First Quarter',
120
- 3 => 'Waxing Gibbous',
121
- 4 => 'Full',
122
- 5 => 'Waning Gibbous',
123
- 6 => 'Last Quarter',
124
- 7 => 'Old Crescent',
125
- },
153
+ PrintConv => \%moonPhase,
126
154
  },
127
155
  0x13 => {
128
156
  Name => 'AmbientTemperatureFahrenheit',
@@ -136,16 +164,7 @@ my %versionInfo = (
136
164
  PrintConv => '"$val C"',
137
165
  PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val',
138
166
  },
139
- 0x15 => {
140
- Name => 'SerialNumber',
141
- Format => 'undef[30]',
142
- RawConv => '$_ = $self->Decode($val, "UCS2"); s/\0.*//; $_',
143
- RawConvInv => q{
144
- $_ = $self->Encode($val, "UCS2");
145
- $_ = substr($_, 0, 30) if length($_) > 30;
146
- return $_;
147
- },
148
- },
167
+ 0x15 => { Name => 'SerialNumber', Format => 'unicode[15]', %convUnicode },
149
168
  0x24 => 'Contrast', #1
150
169
  0x25 => 'Brightness', #1
151
170
  0x26 => 'Sharpness', #1
@@ -169,7 +188,7 @@ my %versionInfo = (
169
188
  );
170
189
 
171
190
  # maker notes for Reconyx UltraFire cameras (ref PH)
172
- %Image::ExifTool::Reconyx::Type2 = (
191
+ %Image::ExifTool::Reconyx::UltraFire = (
173
192
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
174
193
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
175
194
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
@@ -177,7 +196,7 @@ my %versionInfo = (
177
196
  TAG_PREFIX => 'Reconyx',
178
197
  WRITABLE => 1,
179
198
  FIRST_ENTRY => 0,
180
- NOTES => 'Tags extracted from models such as the UltraFire.',
199
+ NOTES => 'Maker notes tags for Reconyx UltraFire models.',
181
200
  # 0x0a - int32u makernote ID 0x00020000 #2
182
201
  # 0x0e - int16u makernote size #2
183
202
  # 0x12 - int32u public structure ID 0x07f100001 #2
@@ -212,17 +231,11 @@ my %versionInfo = (
212
231
  Groups => { 2 => 'Time' },
213
232
  Priority => 0, # (not as reliable as EXIF)
214
233
  Shift => 'Time',
215
- ValueConv => q{
216
- my @a = split ' ', $val;
217
- $a[5] += pop(@a) * 256;
218
- sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', reverse @a);
219
- },
234
+ ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", reverse unpack("C5v",$val))',
220
235
  ValueConvInv => q{
221
236
  my @a = ($val =~ /\d+/g);
222
237
  return undef unless @a >= 6;
223
- unshift @a, ($a[0] >> 8);
224
- $a[1] -= $a[0] * 256;
225
- join ' ', @a[6,5,4,3,2,1,0];
238
+ pack('C5v', @a[5,4,3,2,1,0]);
226
239
  },
227
240
  PrintConv => '$self->ConvertDateTime($val)',
228
241
  PrintConvInv => '$self->InverseDateTime($val)',
@@ -230,29 +243,12 @@ my %versionInfo = (
230
243
  0x42 => { #2
231
244
  Name => 'DayOfWeek',
232
245
  Groups => { 2 => 'Time' },
233
- PrintConv => {
234
- 0 => 'Sunday',
235
- 1 => 'Monday',
236
- 2 => 'Tuesday',
237
- 3 => 'Wednesday',
238
- 4 => 'Thursday',
239
- 5 => 'Friday',
240
- 6 => 'Saturday',
241
- },
246
+ PrintConv => \%sunday0,
242
247
  },
243
248
  0x43 => {
244
249
  Name => 'MoonPhase',
245
250
  Groups => { 2 => 'Time' },
246
- PrintConv => {
247
- 0 => 'New',
248
- 1 => 'New Crescent',
249
- 2 => 'First Quarter',
250
- 3 => 'Waxing Gibbous',
251
- 4 => 'Full',
252
- 5 => 'Waning Gibbous',
253
- 6 => 'Last Quarter',
254
- 7 => 'Old Crescent',
255
- },
251
+ PrintConv => \%moonPhase,
256
252
  },
257
253
  0x44 => {
258
254
  Name => 'AmbientTemperatureFahrenheit',
@@ -278,18 +274,12 @@ my %versionInfo = (
278
274
  PrintConv => '"$val V"',
279
275
  PrintConvInv => '$val=~s/ ?V$//; $val',
280
276
  },
281
- 0x4b => {
282
- Name => 'SerialNumber',
283
- Format => 'string[15]',
284
- },
285
- 0x5a => {
286
- Name => 'UserLabel',
287
- Format => 'string[21]',
288
- },
277
+ 0x4b => { Name => 'SerialNumber', Format => 'string[15]' },
278
+ 0x5a => { Name => 'UserLabel', Format => 'string[21]' },
289
279
  );
290
280
 
291
281
  # maker notes for Reconyx HF2 PRO cameras (ref 3)
292
- %Image::ExifTool::Reconyx::Type3 = (
282
+ %Image::ExifTool::Reconyx::HyperFire2 = (
293
283
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
294
284
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
295
285
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
@@ -297,13 +287,36 @@ my %versionInfo = (
297
287
  TAG_PREFIX => 'Reconyx',
298
288
  WRITABLE => 1,
299
289
  FIRST_ENTRY => 0,
300
- NOTES => 'Tags extracted from models such as the HF2 PRO.',
290
+ NOTES => 'Maker notes tags for Reconyx HyperFire 2 models.',
301
291
  # 0x0a => { Name => 'StructureVersion', Format => 'int16u' },
302
292
  # 0x0c => { Name => 'ParentFileSize', Format => 'int32u' },
303
293
  0x10 => { Name => 'FileNumber', Format => 'int16u' },
304
294
  0x12 => { Name => 'DirectoryNumber', Format => 'int16u' },
305
- # 0x14 => { Name => 'DirCreateDate', Format => 'int16u' },
306
- # 0x16 => { Name => 'DirCreateTime', Format => 'int16u' },
295
+ 0x14 => {
296
+ Name => 'DirectoryCreateDate',
297
+ Format => 'int16u[2]',
298
+ Groups => { 2 => 'Time' },
299
+ Shift => 'Time',
300
+ # similar to ZIP date/time, but date word comes first
301
+ ValueConv => q{
302
+ my @a = split / /, $val;
303
+ sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d',
304
+ ($a[0] >> 9) + 1980, # year
305
+ ($a[0] >> 5) & 0x0f, # month
306
+ $a[0] & 0x1f, # day
307
+ ($a[1] >> 11) & 0x1f, # hour
308
+ ($a[1] >> 5) & 0x3f, # minute
309
+ ($a[1] & 0x1f) * 2 # second
310
+ );
311
+ },
312
+ ValueConvInv => q{
313
+ my @a = $val =~ /\d+/g;
314
+ sprintf('%d %d', (($a[0]-1980) << 9) | ($a[1] << 5) | $a[2],
315
+ ($a[3] << 11) | ($a[4] << 5) | int($a[5] / 2));
316
+ },
317
+ PrintConv => '$self->ConvertDateTime($val)',
318
+ PrintConvInv => '$self->InverseDateTime($val)',
319
+ },
307
320
  # 0x18 - int16[8] SDCardLabel
308
321
  # 0x28 => { Name => 'MakerNoteVersion', Format => 'int16u' },
309
322
  0x2a => {
@@ -353,7 +366,7 @@ my %versionInfo = (
353
366
  ValueConvInv => q{
354
367
  my @a = ($val =~ /\d+/g);
355
368
  return undef unless @a >= 6;
356
- join ' ', @a[6,5,4,3,2,1,0];
369
+ join ' ', @a[5,4,3,2,1,0];
357
370
  },
358
371
  PrintConv => '$self->ConvertDateTime($val)',
359
372
  PrintConvInv => '$self->InverseDateTime($val)',
@@ -362,30 +375,13 @@ my %versionInfo = (
362
375
  Name => 'DayOfWeek',
363
376
  Groups => { 2 => 'Time' },
364
377
  Format => 'int16u',
365
- PrintConv => {
366
- 0 => 'Sunday',
367
- 1 => 'Monday',
368
- 2 => 'Tuesday',
369
- 3 => 'Wednesday',
370
- 4 => 'Thursday',
371
- 5 => 'Friday',
372
- 6 => 'Saturday',
373
- },
378
+ PrintConv => \%sunday0,
374
379
  },
375
380
  0x4c => {
376
381
  Name => 'MoonPhase',
377
382
  Groups => { 2 => 'Time' },
378
383
  Format => 'int16u',
379
- PrintConv => {
380
- 0 => 'New',
381
- 1 => 'New Crescent',
382
- 2 => 'First Quarter',
383
- 3 => 'Waxing Gibbous',
384
- 4 => 'Full',
385
- 5 => 'Waning Gibbous',
386
- 6 => 'Last Quarter',
387
- 7 => 'Old Crescent',
388
- },
384
+ PrintConv => \%moonPhase,
389
385
  },
390
386
  0x4e => {
391
387
  Name => 'AmbientTemperatureFahrenheit',
@@ -411,7 +407,295 @@ my %versionInfo = (
411
407
  0x64 => { Name => 'BatteryVoltageAvg', Format => 'int16u' },
412
408
  0x66 => { Name => 'BatteryType', Format => 'int16u' },
413
409
  0x68 => { Name => 'UserLabel', Format => 'string[22]' },
414
- 0x7e => { Name => 'SerialNumber', Format => 'unicode[15]' },
410
+ 0x7e => { Name => 'SerialNumber', Format => 'unicode[15]', %convUnicode },
411
+ );
412
+
413
+ # maker notes for Reconyx MicroFire cameras (ref 4) (no samples for testing)
414
+ %Image::ExifTool::Reconyx::MicroFire = (
415
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
416
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
417
+ WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
418
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
419
+ TAG_PREFIX => 'Reconyx',
420
+ WRITABLE => 1,
421
+ FIRST_ENTRY => 0,
422
+ NOTES => 'Maker notes tags for Reconyx MicroFire cameras.',
423
+ 0x10 => { Name => 'FileNumber', Format => 'int16u' },
424
+ 0x12 => { Name => 'DirectoryNumber', Format => 'int16u' },
425
+ 0x14 => {
426
+ Name => 'DirectoryCreateDate',
427
+ Format => 'int16u[2]',
428
+ Groups => { 2 => 'Time' },
429
+ Shift => 'Time',
430
+ # similar to ZIP date/time, but date word comes first
431
+ ValueConv => q{
432
+ my @a = split / /, $val;
433
+ sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d',
434
+ ($a[0] >> 9) + 1980, # year
435
+ ($a[0] >> 5) & 0x0f, # month
436
+ $a[0] & 0x1f, # day
437
+ ($a[1] >> 11) & 0x1f, # hour
438
+ ($a[1] >> 5) & 0x3f, # minute
439
+ ($a[1] & 0x1f) * 2 # second
440
+ );
441
+ },
442
+ ValueConvInv => q{
443
+ my @a = $val =~ /\d+/g;
444
+ sprintf('%d %d', (($a[0]-1980) << 9) | ($a[1] << 5) | $a[2],
445
+ ($a[3] << 11) | ($a[4] << 5) | int($a[5]/2));
446
+ },
447
+ PrintConv => '$self->ConvertDateTime($val)',
448
+ PrintConvInv => '$self->InverseDateTime($val)',
449
+ },
450
+ 0x18 => {
451
+ Name => 'SDCardID',
452
+ Format => 'int16u[8]',
453
+ PrintConv => 'join "-", map sprintf("%.4x",$_), split / /, $val',
454
+ },
455
+ # 0x28 - INFO structure version
456
+ 0x2a => {
457
+ Name => 'FirmwareVersion',
458
+ Format => 'int16u[3]',
459
+ ValueConv => 'my @a = split " ",$val; sprintf("%d.%d%c",@a)',
460
+ ValueConvInv => '$val=~/(\d+)\.(\d+)([a-zA-Z])/ ? "$1 $2 ".ord($3) : undef',
461
+ },
462
+ 0x30 => {
463
+ Name => 'FirmwareDate',
464
+ Format => 'int16u[2]',
465
+ ValueConv => 'my ($y,$d) = split " ", $val; sprintf("%.4x:%.2x:%.2x",$y,$d>>8,$d&0xff)',
466
+ ValueConvInv => 'my @a=split ":", $val; hex($a[0])." ".hex($a[1].$a[2])',
467
+ },
468
+ 0x34 => {
469
+ Name => 'BluetoothFirmwareVersion',
470
+ Format => 'int16u[3]',
471
+ ValueConv => 'my @a = split " ",$val; sprintf("%d.%d%c",@a)',
472
+ ValueConvInv => '$val=~/(\d+)\.(\d+)([a-zA-Z])/ ? "$1 $2 ".ord($3) : undef',
473
+ },
474
+ 0x3a => {
475
+ Name => 'BluetoothFirmwareDate',
476
+ Format => 'int16u',
477
+ ValueConv => q{
478
+ sprintf('%.4d:%.2d:%.2d',
479
+ ($val >> 9) + 1980, # year
480
+ ($val >> 5) & 0x0f, # month
481
+ $val & 0x1f, # day
482
+ );
483
+ },
484
+ ValueConvInv => q{
485
+ my @a = $val =~ /\d+/g;
486
+ return (($a[0]-1980) << 9) | ($a[1] << 5) | $a[2];
487
+ },
488
+ },
489
+ 0x3c => {
490
+ Name => 'WifiFirmwareVersion',
491
+ Format => 'int16u[3]',
492
+ ValueConv => 'my @a = split " ",$val; sprintf("%d.%d%c",@a)',
493
+ ValueConvInv => '$val=~/(\d+)\.(\d+)([a-zA-Z])/ ? "$1 $2 ".ord($3) : undef',
494
+ },
495
+ 0x42 => {
496
+ Name => 'WifiFirmwareDate',
497
+ Format => 'int16u',
498
+ ValueConv => q{
499
+ sprintf('%.4d:%.2d:%.2d',
500
+ ($val >> 9) + 1980, # year
501
+ ($val >> 5) & 0x0f, # month
502
+ $val & 0x1f, # day
503
+ );
504
+ },
505
+ ValueConvInv => q{
506
+ my @a = $val =~ /\d+/g;
507
+ return (($a[0]-1980) << 9) | ($a[1] << 5) | $a[2];
508
+ },
509
+ },
510
+ 0x44 => {
511
+ Name => 'TriggerMode',
512
+ Format => 'string[2]',
513
+ PrintConv => {
514
+ M => 'Motion Sensor',
515
+ E => 'External Sensor',
516
+ T => 'Time Lapse',
517
+ C => 'CodeLoc Not Entered',
518
+ },
519
+ },
520
+ 0x46 => {
521
+ Name => 'Sequence',
522
+ Format => 'int16u[2]',
523
+ PrintConv => '$val =~ s/ / of /; $val',
524
+ PrintConvInv => 'join(" ", $val=~/\d+/g)',
525
+ },
526
+ 0x4a => {
527
+ Name => 'EventNumber',
528
+ Format => 'int16u[2]',
529
+ ValueConv => 'my @a=split " ",$val;($a[0]<<16)+$a[1]',
530
+ ValueConvInv => '($val >> 16) . " " . ($val & 0xffff)',
531
+ },
532
+ 0x4e => {
533
+ Name => 'DateTimeOriginal',
534
+ Description => 'Date/Time Original',
535
+ Format => 'int16u[6]',
536
+ Groups => { 2 => 'Time' },
537
+ Priority => 0, # (not as reliable as EXIF)
538
+ Shift => 'Time',
539
+ ValueConv => q{
540
+ my @a = split ' ', $val;
541
+ sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a[5,3,4,2,1,0]);
542
+ },
543
+ ValueConvInv => q{
544
+ my @a = ($val =~ /\d+/g);
545
+ return undef unless @a >= 6;
546
+ join ' ', @a[5,4,3,1,2,0];
547
+ },
548
+ PrintConv => '$self->ConvertDateTime($val)',
549
+ PrintConvInv => '$self->InverseDateTime($val)',
550
+ },
551
+ 0x5a => {
552
+ Name => 'DayOfWeek',
553
+ Format => 'int16u',
554
+ Groups => { 2 => 'Time' },
555
+ PrintConv => \%sunday1,
556
+ },
557
+ 0x5c => {
558
+ Name => 'MoonPhase',
559
+ Format => 'int16u',
560
+ Groups => { 2 => 'Time' },
561
+ PrintConv => \%moonPhase,
562
+ },
563
+ 0x5e => {
564
+ Name => 'AmbientTemperatureFahrenheit',
565
+ Format => 'int16s',
566
+ PrintConv => '"$val F"',
567
+ PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val',
568
+ },
569
+ 0x60 => {
570
+ Name => 'AmbientTemperature',
571
+ Format => 'int16s',
572
+ PrintConv => '"$val C"',
573
+ PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val',
574
+ },
575
+ 0x62 => { Name => 'Contrast', Format => 'int16u' },
576
+ 0x64 => { Name => 'Brightness', Format => 'int16u' },
577
+ 0x66 => { Name => 'Sharpness', Format => 'int16u' },
578
+ 0x68 => { Name => 'Saturation', Format => 'int16u' },
579
+ 0x6a => { Name => 'Flash', Format => 'int8u', PrintConv => { 0 => 'Off', 1 => 'On' } },
580
+ 0x6c => { Name => 'AmbientInfrared', Format => 'int16u' },
581
+ 0x6e => { Name => 'AmbientLight', Format => 'int16u' },
582
+ 0x70 => { Name => 'MotionSensitivity', Format => 'int16u' },
583
+ 0x72 => { Name => 'BatteryVoltage', Format => 'int16u',
584
+ ValueConv => '$val / 1000', ValueConvInv => '$val * 1000',
585
+ },
586
+ 0x74 => { Name => 'BatteryType', Format => 'int16u',
587
+ PrintConv => {
588
+ 0 => 'Lithium',
589
+ 1 => 'NiMH',
590
+ 2 => 'Alkaline',
591
+ 3 => 'Lead Acid',
592
+ },
593
+ },
594
+ 0x76 => { Name => 'UserLabel', Format => 'string[22]' },
595
+ 0x8c => { Name => 'SerialNumber', Format => 'unicode[15]', %convUnicode },
596
+ );
597
+
598
+ # maker notes for Reconyx HyperFire 4K (ref 4)
599
+ %Image::ExifTool::Reconyx::HyperFire4K = (
600
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
601
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
602
+ WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
603
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
604
+ TAG_PREFIX => 'Reconyx',
605
+ WRITABLE => 1,
606
+ FIRST_ENTRY => 0,
607
+ NOTES => 'Maker notes tags for Reconyx HyperFire 4K models.',
608
+ # 0x0c => { Name => 'AgregateStructureVersion', Format => 'int32u' },
609
+ # 0x10 => { Name => 'AgregateStructureSize', Format => 'int32u' },
610
+ # 0x14 => { Name => 'InfoStructureVersion', Format => 'int32u' },
611
+ # 0x18 => { Name => 'InfoStructureSize', Format => 'int16u' },
612
+ 0x1a => { Name => 'FirmwareVersion', %versionInfo },
613
+ 0x21 => { Name => 'UIBFirmwareVersion', %versionInfo },
614
+ 0x28 => {
615
+ Name => 'TriggerMode',
616
+ Format => 'undef[1]',
617
+ PrintConv => {
618
+ M => 'Motion Sensor',
619
+ E => 'External Sensor',
620
+ T => 'Time Lapse',
621
+ C => 'CodeLoc Not Entered',
622
+ S => 'Cell Status',
623
+ L => 'Cell Live View',
624
+ },
625
+ },
626
+ 0x29 => {
627
+ Name => 'Sequence',
628
+ Format => 'int8u[2]',
629
+ PrintConv => '$val =~ s/ / of /; $val',
630
+ PrintConvInv => 'join(" ", $val=~/\d+/g)',
631
+ },
632
+ 0x2b => {
633
+ Name => 'EventNumber',
634
+ Format => 'int32u',
635
+ },
636
+ 0x2f => {
637
+ Name => 'DateTimeOriginal',
638
+ Description => 'Date/Time Original',
639
+ Format => 'undef[7]',
640
+ Groups => { 2 => 'Time' },
641
+ Priority => 0, # (not as reliable as EXIF)
642
+ Shift => 'Time',
643
+ ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", reverse unpack("C5v",$val))',
644
+ ValueConvInv => q{
645
+ my @a = ($val =~ /\d+/g);
646
+ return undef unless @a >= 6;
647
+ pack('C5v', @a[5,4,3,2,1,0]);
648
+ },
649
+ PrintConv => '$self->ConvertDateTime($val)',
650
+ PrintConvInv => '$self->InverseDateTime($val)',
651
+ },
652
+ 0x36 => {
653
+ Name => 'DayOfWeek',
654
+ Groups => { 2 => 'Time' },
655
+ PrintConv => \%sunday1,
656
+ },
657
+ 0x37 => {
658
+ Name => 'MoonPhase',
659
+ Groups => { 2 => 'Time' },
660
+ PrintConv => \%moonPhase,
661
+ },
662
+ 0x38 => {
663
+ Name => 'AmbientTemperatureFahrenheit',
664
+ Format => 'int16s',
665
+ PrintConv => '"$val F"',
666
+ PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val',
667
+ },
668
+ 0x3a => {
669
+ Name => 'AmbientTemperature',
670
+ Format => 'int16s',
671
+ PrintConv => '"$val C"',
672
+ PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val',
673
+ },
674
+ 0x3c => { Name => 'Contrast', Format => 'int16u' },
675
+ 0x3e => { Name => 'Brightness', Format => 'int16u' },
676
+ 0x40 => { Name => 'Sharpness', Format => 'int16u' },
677
+ 0x42 => { Name => 'Saturation', Format => 'int16u' },
678
+ 0x44 => { Name => 'Flash', Format => 'int8u', PrintConv => { 0 => 'Off', 1 => 'On' } },
679
+ 0x45 => { Name => 'AmbientLight', Format => 'int32u' },
680
+ 0x49 => { Name => 'MotionSensitivity', Format => 'int16u' },
681
+ 0x4b => { Name => 'BatteryVoltage', Format => 'int16u',
682
+ ValueConv => '$val / 1000', ValueConvInv => '$val * 1000',
683
+ },
684
+ 0x4d => { Name => 'BatteryVoltageAvg', Format => 'int16u',
685
+ ValueConv => '$val / 1000', ValueConvInv => '$val * 1000',
686
+ },
687
+ 0x4f => { Name => 'BatteryType', Format => 'int16u',
688
+ PrintConv => {
689
+ 1 => 'NiMH',
690
+ 2 => 'Lithium',
691
+ 3 => 'External',
692
+ 4 => 'SC10 Solar',
693
+ },
694
+ },
695
+ 0x51 => { Name => 'UserLabel', Format => 'string[51]' },
696
+ 0x84 => { Name => 'SerialNumber', Format => 'string[15]' },
697
+ 0x93 => { Name => 'DirectoryNumber', Format => 'int16u' },
698
+ 0x95 => { Name => 'FileNumber', Format => 'int16u' },
415
699
  );
416
700
 
417
701
  __END__
@@ -947,7 +947,7 @@ my %formatMinMax = (
947
947
  # if necessary to differentiate tags with the same ID but different names
948
948
  %Image::ExifTool::Samsung::Trailer = (
949
949
  GROUPS => { 0 => 'MakerNotes', 2 => 'Other' },
950
- VARS => { NO_ID => 1, HEX_ID => 0 },
950
+ VARS => { ID_FMT => 'none' },
951
951
  PROCESS_PROC => \&ProcessSamsung,
952
952
  TAG_PREFIX => 'SamsungTrailer',
953
953
  PRIORITY => 0, # (first one takes priority so DepthMapWidth/Height match first DepthMapData)