exiftool_vendored 12.76.1 → 12.81.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +105 -4
  3. data/bin/MANIFEST +29 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +4 -3
  7. data/bin/config_files/acdsee.config +37 -57
  8. data/bin/config_files/example.config +16 -2
  9. data/bin/exiftool +102 -31
  10. data/bin/lib/Image/ExifTool/Canon.pm +12 -9
  11. data/bin/lib/Image/ExifTool/CanonVRD.pm +8 -2
  12. data/bin/lib/Image/ExifTool/Exif.pm +52 -4
  13. data/bin/lib/Image/ExifTool/FujiFilm.pm +14 -5
  14. data/bin/lib/Image/ExifTool/GPS.pm +5 -3
  15. data/bin/lib/Image/ExifTool/GeoLang/cs.pm +978 -0
  16. data/bin/lib/Image/ExifTool/GeoLang/de.pm +1975 -0
  17. data/bin/lib/Image/ExifTool/GeoLang/en_ca.pm +44 -0
  18. data/bin/lib/Image/ExifTool/GeoLang/en_gb.pm +124 -0
  19. data/bin/lib/Image/ExifTool/GeoLang/es.pm +2921 -0
  20. data/bin/lib/Image/ExifTool/GeoLang/fi.pm +1116 -0
  21. data/bin/lib/Image/ExifTool/GeoLang/fr.pm +3171 -0
  22. data/bin/lib/Image/ExifTool/GeoLang/it.pm +2750 -0
  23. data/bin/lib/Image/ExifTool/GeoLang/ja.pm +10256 -0
  24. data/bin/lib/Image/ExifTool/GeoLang/ko.pm +4499 -0
  25. data/bin/lib/Image/ExifTool/GeoLang/nl.pm +1270 -0
  26. data/bin/lib/Image/ExifTool/GeoLang/pl.pm +3019 -0
  27. data/bin/lib/Image/ExifTool/GeoLang/ru.pm +18220 -0
  28. data/bin/lib/Image/ExifTool/GeoLang/sk.pm +441 -0
  29. data/bin/lib/Image/ExifTool/GeoLang/sv.pm +714 -0
  30. data/bin/lib/Image/ExifTool/GeoLang/tr.pm +452 -0
  31. data/bin/lib/Image/ExifTool/GeoLang/zh_cn.pm +2225 -0
  32. data/bin/lib/Image/ExifTool/GeoLang/zh_tw.pm +72 -0
  33. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  34. data/bin/lib/Image/ExifTool/Geolocation.pm +935 -0
  35. data/bin/lib/Image/ExifTool/Geotag.pm +14 -2
  36. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -1
  37. data/bin/lib/Image/ExifTool/Import.pm +5 -2
  38. data/bin/lib/Image/ExifTool/JSON.pm +15 -10
  39. data/bin/lib/Image/ExifTool/M2TS.pm +32 -4
  40. data/bin/lib/Image/ExifTool/MWG.pm +1 -0
  41. data/bin/lib/Image/ExifTool/MacOS.pm +19 -4
  42. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  43. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  44. data/bin/lib/Image/ExifTool/Nikon.pm +331 -23
  45. data/bin/lib/Image/ExifTool/NikonCustom.pm +55 -1
  46. data/bin/lib/Image/ExifTool/Ogg.pm +3 -2
  47. data/bin/lib/Image/ExifTool/Olympus.pm +4 -1
  48. data/bin/lib/Image/ExifTool/OpenEXR.pm +37 -19
  49. data/bin/lib/Image/ExifTool/PDF.pm +5 -5
  50. data/bin/lib/Image/ExifTool/PNG.pm +3 -3
  51. data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  52. data/bin/lib/Image/ExifTool/QuickTime.pm +195 -12
  53. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +253 -237
  54. data/bin/lib/Image/ExifTool/README +6 -5
  55. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  56. data/bin/lib/Image/ExifTool/TagLookup.pm +4871 -4752
  57. data/bin/lib/Image/ExifTool/TagNames.pod +722 -383
  58. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +43 -9
  59. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  60. data/bin/lib/Image/ExifTool/Writer.pl +65 -8
  61. data/bin/lib/Image/ExifTool/XMP.pm +18 -2
  62. data/bin/lib/Image/ExifTool/XMP2.pl +64 -0
  63. data/bin/lib/Image/ExifTool.pm +265 -49
  64. data/bin/lib/Image/ExifTool.pod +63 -25
  65. data/bin/perl-Image-ExifTool.spec +2 -2
  66. data/lib/exiftool_vendored/version.rb +1 -1
  67. metadata +22 -2
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
40
40
  use Image::ExifTool::Exif;
41
41
  use Image::ExifTool::APP12;
42
42
 
43
- $VERSION = '2.82';
43
+ $VERSION = '2.83';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -117,6 +117,7 @@ my %olympusLensTypes = (
117
117
  '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
118
118
  '0 37 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0 Pro', #forum3833
119
119
  '0 39 10' => 'Olympus M.Zuiko Digital ED 90mm F3.5 Macro IS Pro', #forum3833
120
+ '0 40 10' => 'Olympus M.Zuiko Digital ED 150-600mm F5.0-6.3', #forum15652
120
121
  # Sigma lenses
121
122
  '1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8
122
123
  '1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ
@@ -196,6 +197,7 @@ my %olympusLensTypes = (
196
197
  # '65535 07 40' - Seen for LUMIX S 16-35/F4 on Panasonic DC-S1H (ref PH)
197
198
  # Other makes
198
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
199
201
  );
200
202
 
201
203
  # lookup for Olympus camera types (ref PH)
@@ -442,6 +444,7 @@ my %olympusCameraTypes = (
442
444
  S0093 => 'E-P7', #IB
443
445
  S0095 => 'OM-1', #IB
444
446
  S0101 => 'OM-5', #IB
447
+ S0121 => 'OM-1MarkII', #forum15652
445
448
  SR45 => 'D220',
446
449
  SR55 => 'D320L',
447
450
  SR83 => 'D340L',
@@ -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.04';
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 = (
@@ -134,7 +134,7 @@ my %formatType = (
134
134
  multiView => { },
135
135
  owner => { Groups => { 2 => 'Author' } },
136
136
  pixelAspectRatio => { },
137
- preview => { },
137
+ preview => { Groups => { 2 => 'Preview' } },
138
138
  renderingTransform => { },
139
139
  screenWindowCenter => { },
140
140
  screenWindowWidth => { },
@@ -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
  );
@@ -219,25 +232,30 @@ sub ProcessEXR($$)
219
232
  AddTagToTable($tagTablePtr, $tag, $tagInfo);
220
233
  $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
221
234
  }
222
- my ($val, $success);
235
+ my ($val, $success, $buf2);
223
236
  my $format = $formatType{$type};
224
- if ($format or $binary) {
225
- $raf->Read($buff, $size) == $size and $success = 1;
226
- if (not $format) {
227
- $val = \$buff; # treat as undef binary data
237
+ my $subdir = $$tagInfo{SubDirectory};
238
+ if ($format or $binary or $subdir) {
239
+ $raf->Read($buf2, $size) == $size and $success = 1;
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) {
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
230
248
  if ($format =~ /^(\w+)\[?(\d*)/) {
231
249
  my ($fmt, $cnt) = ($1, $2);
232
250
  $cnt = $fmt eq 'string' ? $size : 1 unless $cnt;
233
- $val = ReadValue(\$buff, 0, $fmt, $cnt, $size);
251
+ $val = ReadValue(\$buf2, 0, $fmt, $cnt, $size);
234
252
  }
235
253
  # handle other format types
236
254
  } elsif ($type eq 'tiledesc') {
237
255
  if ($size >= 9) {
238
- my $x = Get32u(\$buff, 0);
239
- my $y = Get32u(\$buff, 4);
240
- my $mode = Get8u(\$buff, 8);
256
+ my $x = Get32u(\$buf2, 0);
257
+ my $y = Get32u(\$buf2, 4);
258
+ my $mode = Get8u(\$buf2, 8);
241
259
  my $lvl = { 0 => 'One Level', 1 => 'MIMAP Levels', 2 => 'RIPMAP Levels' }->{$mode & 0x0f};
242
260
  $lvl or $lvl = 'Unknown Levels (' . ($mode & 0xf) . ')';
243
261
  my $rnd = { 0 => 'Round Down', 1 => 'Round Up' }->{$mode >> 4};
@@ -246,7 +264,7 @@ sub ProcessEXR($$)
246
264
  }
247
265
  } elsif ($type eq 'chlist') {
248
266
  $val = [ ];
249
- while ($buff =~ /\G([^\0]{1,31})\0(.{16})/sg) {
267
+ while ($buf2 =~ /\G([^\0]{1,31})\0(.{16})/sg) {
250
268
  my ($str, $dat) = ($1, $2);
251
269
  my ($pix,$lin,$x,$y) = unpack('VCx3VV', $dat);
252
270
  $pix = { 0 => 'int8u', 1 => 'half', 2 => 'float' }->{$pix} || "unknown($pix)";
@@ -255,14 +273,14 @@ sub ProcessEXR($$)
255
273
  } elsif ($type eq 'stringvector') {
256
274
  $val = [ ];
257
275
  my $pos = 0;
258
- while ($pos + 4 <= length($buff)) {
259
- my $len = Get32u(\$buff, $pos);
260
- last if $pos + 4 + $len > length($buff);
261
- push @$val, substr($buff, $pos + 4, $len);
276
+ while ($pos + 4 <= length($buf2)) {
277
+ my $len = Get32u(\$buf2, $pos);
278
+ last if $pos + 4 + $len > length($buf2);
279
+ push @$val, substr($buf2, $pos + 4, $len);
262
280
  $pos += 4 + $len;
263
281
  }
264
282
  } else {
265
- $val = \$buff; # (shouldn't happen)
283
+ $val = \$buf2; # (shouldn't happen)
266
284
  }
267
285
  } else {
268
286
  # avoid loading binary data
@@ -282,13 +300,13 @@ sub ProcessEXR($$)
282
300
  $dim = [$3 - $1 + 1, $4 - $2 + 1];
283
301
  }
284
302
  if ($verbose) {
285
- my $dataPt = ref $val ? $val : \$val,
303
+ my $dataPt = ref $val eq 'SCALAR' ? $val : \$buf2;
286
304
  $et->VerboseInfo($tag, $tagInfo,
287
305
  Table => $tagTablePtr,
288
306
  Value => $val,
289
307
  Size => $size,
290
308
  Format => $type,
291
- DataPt => \$buff,
309
+ DataPt => $dataPt,
292
310
  Addr => $raf->Tell() - $size,
293
311
  );
294
312
  }
@@ -114,11 +114,11 @@ my %supportedFilter = (
114
114
  Notes => q{
115
115
  stored as a string but treated as a comma- or semicolon-separated list of
116
116
  items when reading if the string contains commas or semicolons, whichever is
117
- more numerous, otherwise it is treated a space-separated list of items.
118
- Written as a comma-separated list. The list behaviour may be defeated by
119
- setting the API NoPDFList option. Note that the corresponding
120
- XMP-pdf:Keywords tag is not treated as a list, so the NoPDFList option
121
- should be used when copying between these two.
117
+ more numerous, otherwise it is treated a space-separated list of items. The
118
+ list behaviour may be defeated by setting the API NoPDFList option. Written
119
+ as a comma-separated string. Note that the corresponding XMP-pdf:Keywords
120
+ tag is not treated as a list, so the NoPDFList option should be used when
121
+ copying between these two.
122
122
  },
123
123
  },
124
124
  Creator => { },
@@ -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' },
@@ -177,7 +177,7 @@ sub DecodeAFPoints($$$$;$);
177
177
  '4 6' => 'smc PENTAX-FA 35-80mm F4-5.6',
178
178
  '4 7' => 'Irix 45mm F1.4', #27
179
179
  '4 8' => 'Irix 150mm F2.8 Macro', #exiv2 issue 1084
180
- '4 9' => 'Irix 11mm F4 Firefly', #27
180
+ '4 9' => 'Irix 11mm F4 Firefly', #27 (guessing the Blackstone version may be the same ID - PH)
181
181
  '4 10' => 'Irix 15mm F2.4', #27
182
182
  '4 12' => 'smc PENTAX-FA 50mm F1.4', #17
183
183
  '4 15' => 'smc PENTAX-FA 28-105mm F4-5.6 [IF]',
@@ -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.93';
51
+ $VERSION = '2.94';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -58,11 +58,14 @@ sub ProcessEncodingParams($$$);
58
58
  sub ProcessSampleDesc($$$);
59
59
  sub ProcessHybrid($$$);
60
60
  sub ProcessRights($$$);
61
+ sub ProcessNextbase($$$);
61
62
  # ++vvvvvvvvvvvv++ (in QuickTimeStream.pl)
62
63
  sub Process_mebx($$$);
63
64
  sub Process_3gf($$$);
64
65
  sub Process_gps0($$$);
65
66
  sub Process_gsen($$$);
67
+ sub Process_gdat($$$);
68
+ sub Process_nbmt($$$);
66
69
  sub ProcessKenwood($$$);
67
70
  sub ProcessLIGO_JSON($$$);
68
71
  sub ProcessRIFFTrailer($$$);
@@ -88,6 +91,7 @@ sub UnpackLang($;$);
88
91
  sub WriteKeys($$$);
89
92
  sub WriteQuickTime($$$);
90
93
  sub WriteMOV($$);
94
+ sub WriteNextbase($$$);
91
95
  sub GetLangInfo($$);
92
96
  sub CheckQTValue($$$);
93
97
 
@@ -656,6 +660,14 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
656
660
  Name => 'SensorData', # sensor data for the 360Fly
657
661
  Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/ and $$self{OPTIONS}{ExtractEmbedded}',
658
662
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Tags360Fly' },
663
+ },{
664
+ Name => 'SensorData',
665
+ Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
666
+ Notes => 'raw 360Fly sensor data without ExtractEmbedded option',
667
+ RawConv => q{
668
+ $self->WarnOnce('Use the ExtractEmbedded option to decode timed SensorData',3);
669
+ return \$val;
670
+ },
659
671
  },
660
672
  { #https://c2pa.org/specifications/
661
673
  Name => 'JUMBF',
@@ -685,18 +697,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
685
697
  Start => 27,
686
698
  },
687
699
  },
688
- {
689
- Name => 'SensorData',
690
- Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
691
- Notes => 'raw 360Fly sensor data without ExtractEmbedded option',
692
- RawConv => q{
693
- $self->WarnOnce('Use the ExtractEmbedded option to decode timed SensorData',3);
694
- return \$val;
695
- },
696
- },
697
700
  { #PH (Canon CR3)
698
701
  Name => 'PreviewImage',
699
- Condition => '$$valPt=~/^\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16/',
702
+ Condition => '$$valPt=~/^\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16.{32}/s',
700
703
  Groups => { 2 => 'Preview' },
701
704
  PreservePadding => 1,
702
705
  # 0x00 - undef[16]: UUID
@@ -711,6 +714,25 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
711
714
  # 0x3c - int32u: preview length
712
715
  RawConv => '$val = substr($val, 0x30); $self->ValidateImage(\$val, $tag)',
713
716
  },
717
+ { #PH (Garmin MP4)
718
+ Name => 'ThumbnailImage',
719
+ Condition => '$$valPt=~/^\x11\x6e\x40\xdc\xb1\x86\x46\xe4\x84\x7c\xd9\xc0\xc3\x49\x10\x81.{8}\xff\xd8\xff/s',
720
+ Groups => { 2 => 'Preview' },
721
+ Binary => 1,
722
+ # 0x00 - undef[16]: UUID
723
+ # 0x10 - int32u[2]: ThumbnailLength
724
+ # 0x14 - int16u[2]: width/height of image (160/120)
725
+ RawConv => q{
726
+ my $len = Get32u(\$val, 0x10);
727
+ return undef unless length($val) >= $len + 0x18;
728
+ return substr($val, 0x18, $len);
729
+ },
730
+ },
731
+ # also seen 120-byte record in Garmin MP4's, starting like this (model name at byte 9):
732
+ # 0000: 47 52 4d 4e 00 00 00 01 00 44 43 35 37 00 00 00 [GRMN.....DC57...]
733
+ # 0000: 47 52 4d 4e 00 00 00 01 00 44 43 36 36 57 00 00 [GRMN.....DC66W..]
734
+ # and this in Garmin, followed by 8 bytes of 0's:
735
+ # 0000: db 11 98 3d 8f 65 43 8c bb b8 e1 ac 56 fe 6b 04
714
736
  { #8
715
737
  Name => 'UUID-Unknown',
716
738
  %unknownInfo,
@@ -835,6 +857,20 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
835
857
  },
836
858
  # gpsa - seen hex "01 20 00 00" (DuDuBell M1, VSYS M6L)
837
859
  # gsea - 20 bytes hex "05 00's..." (DuDuBell M1) "05 08 02 01 ..." (VSYS M6L)
860
+ gdat => { # Base64-encoded JSON-format timed GPS (Nextbase software)
861
+ Name => 'GPSData',
862
+ SubDirectory => {
863
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
864
+ ProcessProc => \&Process_gdat,
865
+ },
866
+ },
867
+ nbmt => { # (Nextbase)
868
+ Name => 'NextbaseMeta',
869
+ SubDirectory => {
870
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
871
+ ProcessProc => \&Process_nbmt,
872
+ },
873
+ },
838
874
  'GPS ' => { # GPS data written by 70mai dashcam (parsed in QuickTimeStream.pl)
839
875
  Name => 'GPSDataList2',
840
876
  Unknown => 1,
@@ -2090,8 +2126,21 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2090
2126
  Condition => '$$valPt =~ /^VIRBactioncamera/',
2091
2127
  RawConv => 'substr($val, 16)',
2092
2128
  RawConvInv => '"VIRBactioncamera$val"',
2129
+ },{
2130
+ Name => 'GarminModel', # (NC)
2131
+ Condition => '$$valPt =~ /^\xf7\x6c\xd7\x6a\x07\x5b\x4a\x1e\xb3\x1c\x0e\x7f\xab\x7e\x09\xd4/',
2132
+ Writable => 0,
2133
+ RawConv => q{
2134
+ return undef unless length($val) > 25;
2135
+ my $len = unpack('x24C', $val);
2136
+ return undef unless length($val) >= 25 + $len;
2137
+ return substr($val, 25, $len);
2138
+ },
2093
2139
  },{
2094
2140
  # have seen "28 f3 11 e2 b7 91 4f 6f 94 e2 4f 5d ea cb 3c 01" for RicohThetaZ1 accelerometer RADT data (not yet decoded)
2141
+ # also seen in Garmin MP4:
2142
+ # 51 0b 63 46 6c fd 4a 17 87 42 ea c9 ea ae b3 bd - seems to contain a duplicate of the trak atom
2143
+ # b3 e8 21 f4 fe 33 4e 10 8f 92 f5 e1 d4 36 c9 8a - 8 bytes of zeros
2095
2144
  Name => 'UUID-Unknown',
2096
2145
  Writable => 0,
2097
2146
  %unknownInfo,
@@ -2399,6 +2448,30 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2399
2448
  Groups => { 2 => 'Preview' },
2400
2449
  Binary => 1,
2401
2450
  },
2451
+ # ---- Nextbase ----
2452
+ info => 'FirmwareVersion',
2453
+ 'time' => {
2454
+ Name => 'TimeStamp',
2455
+ Format => 'int32u', # (followed by 4 unknown bytes 00 0d 00 00)
2456
+ Writable => 0,
2457
+ Groups => { 2 => 'Time' },
2458
+ ValueConv => '$val =~ s/ .*//; ConvertUnixTime($val)',
2459
+ PrintConv => '$self->ConvertDateTime($val)',
2460
+ },
2461
+ infi => {
2462
+ Name => 'CameraInfo',
2463
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Nextbase' },
2464
+ },
2465
+ finm => {
2466
+ Name => 'OriginalFileName',
2467
+ Writable => 0,
2468
+ },
2469
+ # AMBA ? - (133 bytes)
2470
+ # nbpl ? - "FP-433-KC"
2471
+ nbpl => { Name => 'Unknown_nbpl', Unknown => 1, Hidden => 1 },
2472
+ # maca ? - b8 2d 28 15 f1 48
2473
+ # sern ? - 0d 69 42 74
2474
+ # nbid ? - 0d 69 42 74 65 df 72 65 03 de c0 fb 01 01 00 00
2402
2475
  # ---- Unknown ----
2403
2476
  # CDET - 128 bytes (unknown origin)
2404
2477
  # mtyp - 4 bytes all zero (some drone video)
@@ -6655,7 +6728,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6655
6728
  %Image::ExifTool::QuickTime::iTunesInfo = (
6656
6729
  PROCESS_PROC => \&ProcessMOV,
6657
6730
  GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
6658
- VARS => { LONG_TAGS => 0 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
6731
+ VARS => { LONG_TAGS => 1 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
6659
6732
  NOTES => q{
6660
6733
  ExifTool will extract any iTunesInfo tags that exist, even if they are not
6661
6734
  defined in this table. These tags belong to the family 1 "iTunes" group,
@@ -6731,6 +6804,17 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6731
6804
  BARCODE => 'Barcode',
6732
6805
  LABEL => 'Label',
6733
6806
  MOOD => 'Mood',
6807
+ DIRECTOR => 'Director',
6808
+ DIRECTOR_OF_PHOTOGRAPHY => 'DirectorOfPhotography',
6809
+ PRODUCTION_DESIGNER => 'ProductionDesigner',
6810
+ COSTUME_DESIGNER => 'CostumeDesigner',
6811
+ SCREENPLAY_BY => 'ScreenplayBy',
6812
+ EDITED_BY => 'EditedBy',
6813
+ PRODUCER => 'Producer',
6814
+ IMDB_ID => { },
6815
+ TMDB_ID => { },
6816
+ Actors => { },
6817
+ TIPL => { },
6734
6818
  popularimeter => 'Popularimeter',
6735
6819
  'Dynamic Range (DR)'=> 'DynamicRange',
6736
6820
  initialkey => 'InitialKey',
@@ -8087,6 +8171,88 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
8087
8171
  },
8088
8172
  );
8089
8173
 
8174
+ # Nextbase tags (ref PH)
8175
+ %Image::ExifTool::QuickTime::Nextbase = (
8176
+ GROUPS => { 1 => 'Nextbase', 2 => 'Camera' },
8177
+ PROCESS_PROC => \&ProcessNextbase,
8178
+ WRITE_PROC => \&WriteNextbase,
8179
+ VARS => { LONG_TAGS => 3 },
8180
+ NOTES => q{
8181
+ Tags found in 'infi' atom from some Nextbase videos. As well as these tags,
8182
+ other existing tags are also extracted. These tags are not currently
8183
+ writable but they may all be removed by deleting the Nextbase group.
8184
+ },
8185
+ 'Wi-Fi SSID' => { },
8186
+ 'Wi-Fi Password' => { },
8187
+ 'Wi-Fi MAC Address' => { },
8188
+ 'Model' => { },
8189
+ 'Firmware' => { },
8190
+ 'Serial No' => { Name => 'SerialNumber' },
8191
+ 'FCC-ID' => { },
8192
+ 'Battery Status' => { },
8193
+ 'SD Card Manf ID' => { },
8194
+ 'SD Card OEM ID' => { },
8195
+ 'SD Card Model No' => { },
8196
+ 'SD Card Serial No' => { },
8197
+ 'SD Card Manf Date' => { },
8198
+ 'SD Card Type' => { },
8199
+ 'SD Card Used Space' => { },
8200
+ 'SD Card Class' => { },
8201
+ 'SD Card Size' => { },
8202
+ 'SD Card Format' => { },
8203
+ 'Wi-Fi SSID' => { },
8204
+ 'Wi-Fi Password' => { },
8205
+ 'Wi-Fi MAC Address' => { },
8206
+ 'Bluetooth Name' => { },
8207
+ 'Bluetooth MAC Address' => { },
8208
+ 'Resolution' => { },
8209
+ 'Exposure' => { },
8210
+ 'Video Length' => { },
8211
+ 'Audio' => { },
8212
+ 'Time Stamp' => { Name => 'VideoTimeStamp' },
8213
+ 'Speed Stamp' => { },
8214
+ 'GPS Stamp' => { },
8215
+ 'Model Stamp' => { },
8216
+ 'Dual Files' => { },
8217
+ 'Time Lapse' => { },
8218
+ 'Number / License Plate' => { },
8219
+ 'G Sensor' => { },
8220
+ 'Image Stabilisation' => { },
8221
+ 'Extreme Weather Mode' => { },
8222
+ 'Screen Saver' => { },
8223
+ 'Alerts' => { },
8224
+ 'Recording History' => { },
8225
+ 'Parking Mode' => { },
8226
+ 'Language' => { },
8227
+ 'Country' => { },
8228
+ 'Time Zone / DST' => { Groups => { 2 => 'Time' } },
8229
+ 'Time & Date' => { Name => 'TimeAndDate', Groups => { 2 => 'Time' } },
8230
+ 'Speed Units' => { },
8231
+ 'Device Sounds' => { },
8232
+ 'Screen Dimming' => { },
8233
+ 'Auto Power Off' => { },
8234
+ 'Keep User Settings' => { },
8235
+ 'System Info' => { },
8236
+ 'Format SD Card' => { },
8237
+ 'Default Settings' => { },
8238
+ 'Emergency SOS' => { },
8239
+ 'Reversing Camera' => { },
8240
+ 'what3words' => { Name => 'What3Words' },
8241
+ 'MyNextbase - Pairing' => { },
8242
+ 'MyNextbase - Paired Device Name' => { },
8243
+ 'Alexa' => { },
8244
+ 'Alexa - Pairing' => { },
8245
+ 'Alexa - Paired Device Name' => { },
8246
+ 'Alexa - Privacy Mode' => { },
8247
+ 'Alexa - Wake Word Language' => { },
8248
+ 'Firmware Version' => { },
8249
+ 'RTOS' => { },
8250
+ 'Linux' => { },
8251
+ 'NBCD' => { },
8252
+ 'Alexa' => { },
8253
+ '2nd Cam' => { Name => 'SecondCam' },
8254
+ );
8255
+
8090
8256
  # QuickTime composite tags
8091
8257
  %Image::ExifTool::QuickTime::Composite = (
8092
8258
  GROUPS => { 2 => 'Video' },
@@ -9149,6 +9315,23 @@ sub ProcessRights($$$)
9149
9315
  return 1;
9150
9316
  }
9151
9317
 
9318
+ #------------------------------------------------------------------------------
9319
+ # Process Nextbase 'infi' atom (ref PH)
9320
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
9321
+ # Returns: 1 on success
9322
+ sub ProcessNextbase($$$)
9323
+ {
9324
+ my ($et, $dirInfo, $tagTbl) = @_;
9325
+ my $dataPt = $$dirInfo{DataPt};
9326
+ $et->VerboseDir('Nextbase', undef, length($$dataPt));
9327
+ while ($$dataPt =~ /(.*?): +(.*)\x0d/g) {
9328
+ my ($id, $val) = ($1, $2);
9329
+ $$tagTbl{$id} or AddTagToTable($tagTbl, $id, { Name => Image::ExifTool::MakeTagName($id) });
9330
+ $et->HandleTag($tagTbl, $id, $val, Size => length($val));
9331
+ }
9332
+ return 1;
9333
+ }
9334
+
9152
9335
  #------------------------------------------------------------------------------
9153
9336
  # Process iTunes Encoding Params (ref PH)
9154
9337
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref