exiftool_vendored 13.12.0 → 13.16.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +79 -22
  3. data/bin/MANIFEST +7 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +2 -2
  7. data/bin/arg_files/exif2xmp.args +4 -0
  8. data/bin/arg_files/xmp2exif.args +2 -1
  9. data/bin/build_geolocation +1 -1
  10. data/bin/exiftool +6 -5
  11. data/bin/lib/Image/ExifTool/AFCP.pm +5 -5
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +20 -15
  13. data/bin/lib/Image/ExifTool/Canon.pm +5 -3
  14. data/bin/lib/Image/ExifTool/DJI.pm +64 -11
  15. data/bin/lib/Image/ExifTool/EXE.pm +17 -3
  16. data/bin/lib/Image/ExifTool/Geolocation.pm +16 -7
  17. data/bin/lib/Image/ExifTool/ID3.pm +4 -4
  18. data/bin/lib/Image/ExifTool/JPEG.pm +5 -1
  19. data/bin/lib/Image/ExifTool/LigoGPS.pm +1 -0
  20. data/bin/lib/Image/ExifTool/MIE.pm +6 -3
  21. data/bin/lib/Image/ExifTool/Nikon.pm +328 -4
  22. data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  23. data/bin/lib/Image/ExifTool/Panasonic.pm +7 -1
  24. data/bin/lib/Image/ExifTool/Protobuf.pm +25 -7
  25. data/bin/lib/Image/ExifTool/QuickTime.pm +215 -59
  26. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +12 -12
  27. data/bin/lib/Image/ExifTool/README +4 -1
  28. data/bin/lib/Image/ExifTool/RIFF.pm +11 -1
  29. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  30. data/bin/lib/Image/ExifTool/TagLookup.pm +4821 -4811
  31. data/bin/lib/Image/ExifTool/TagNames.pod +231 -25
  32. data/bin/lib/Image/ExifTool/Torrent.pm +2 -2
  33. data/bin/lib/Image/ExifTool/Vivo.pm +124 -0
  34. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +114 -63
  35. data/bin/lib/Image/ExifTool/WriteRIFF.pl +3 -1
  36. data/bin/lib/Image/ExifTool/Writer.pl +16 -11
  37. data/bin/lib/Image/ExifTool.pm +24 -8
  38. data/bin/lib/Image/ExifTool.pod +52 -49
  39. data/bin/perl-Image-ExifTool.spec +1 -1
  40. data/lib/exiftool_vendored/version.rb +1 -1
  41. metadata +3 -2
@@ -18,14 +18,15 @@ use Image::ExifTool::XMP;
18
18
  use Image::ExifTool::GPS;
19
19
  use Image::ExifTool::Protobuf;
20
20
 
21
- $VERSION = '1.11';
21
+ $VERSION = '1.12';
22
22
 
23
23
  sub ProcessDJIInfo($$$);
24
24
 
25
25
  %knownProtocol = (
26
- 'dvtm_ac203.proto' => 1,
27
- 'dvtm_ac204.proto' => 1,
28
- 'dvtm_AVATA2.proto' => 1,
26
+ 'dvtm_ac203.proto' => 1, # Osmo Action 4
27
+ 'dvtm_ac204.proto' => 1, # Osmo Action 5
28
+ 'dvtm_AVATA2.proto' => 1, # Avanta 2
29
+ 'dvtm_wm265e.proto' => 1, # Mavic 3
29
30
  );
30
31
 
31
32
  my %convFloat2 = (
@@ -200,15 +201,19 @@ my %convFloat2 = (
200
201
  TAG_PREFIX => '',
201
202
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
202
203
  NOTES => q{
203
- Tags found in protobuf-format DJI djmd and dbgi timed metadata. Only a few
204
- tags are currently known, but unknown djmd tags may be extracted by setting
205
- the Unknown option to 1 (or 2 to also extract unknown dbgi debug tags). Tag
206
- ID's are composed of the corresponding .proto file name combined with the
207
- hierarchical protobuf field numbers.
204
+ Tags found in protobuf-format DJI djmd and dbgi timed metadata. The known
205
+ tags listed below are extracted by default, but unknown djmd tags may be
206
+ extracted as well by setting the Unknown option to 1, or 2 to also extract
207
+ unknown dbgi debug tags. Tag ID's are composed of the corresponding .proto
208
+ file name combined with the hierarchical protobuf field numbers.
208
209
 
209
210
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
210
211
  which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
211
- dvtm_ac203.proto (Osmo Action 4), and dvtm_ac204.proto (Osmo Action 5).
212
+ dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5) and
213
+ dvtm_wm265e.proto (Mavic 3).
214
+
215
+ Note that with the protobuf format, numerical tags missing from the output
216
+ for a given protocol should be considered to have the default value of 0.
212
217
  },
213
218
  Protocol => {
214
219
  RawConv => q{
@@ -218,6 +223,10 @@ my %convFloat2 = (
218
223
  return $val;
219
224
  },
220
225
  },
226
+ #
227
+ # Osmo Action 4
228
+ #
229
+ 'dvtm_ac203_1-1-5' => 'SerialNumber', # (NC)
221
230
  # dvtm_ac203_1-1-6 - some version number
222
231
  'dvtm_ac203_1-1-10' => 'Model',
223
232
  'dvtm_ac203_2-3' => {
@@ -243,6 +252,10 @@ my %convFloat2 = (
243
252
  ValueConv => '$val =~ tr/-/:/; $val',
244
253
  PrintConv => '$self->ConvertDateTime($val)',
245
254
  },
255
+ #
256
+ # Osmo Action 5
257
+ #
258
+ 'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
246
259
  # dvtm_ac204_1-1-6 - some version number
247
260
  'dvtm_ac204_1-1-10' => 'Model',
248
261
  'dvtm_ac204_2-3' => {
@@ -254,6 +267,7 @@ my %convFloat2 = (
254
267
  Name => 'GPSInfo',
255
268
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
256
269
  },
270
+ # dvtm_ac204_3-2-4-1 - shutter speed? (rational)
257
271
  'dvtm_ac204_3-4-2-2' => {
258
272
  Name => 'GPSAltitude',
259
273
  Groups => { 2 => 'Location' },
@@ -268,10 +282,15 @@ my %convFloat2 = (
268
282
  ValueConv => '$val =~ tr/-/:/; $val',
269
283
  PrintConv => '$self->ConvertDateTime($val)',
270
284
  },
285
+ #
286
+ # Avanta 2
287
+ #
271
288
  # dvtm_AVATA2_1-1-2 - some version number
272
289
  # dvtm_AVATA2_1-1-3 - some version number
290
+ 'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
273
291
  'dvtm_AVATA2_1-1-10' => 'Model',
274
- 'dvtm_AVATA2_2-2-3-1' => 'SerialNumber', # (NC)
292
+ # dvtm_AVATA2_2-2-1-4 - model code?
293
+ 'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
275
294
  'dvtm_AVATA2_2-3' => {
276
295
  Name => 'FrameInfo',
277
296
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
@@ -285,11 +304,45 @@ my %convFloat2 = (
285
304
  ValueConv => '$val / 1e6',
286
305
  },
287
306
  # dvtm_AVATA2_3-2-1-4 - model code?
307
+ # dvtm_AVATA2_3-2-1-5 - frame rate?
308
+ # dvtm_AVATA2_3-2-4-1 - shutter speed? (rational)
288
309
  # dvtm_AVATA2_3-4-1-4 - model code?
310
+ # dvtm_AVATA2_3-4-3-1,2,3 - YPR? (int64s)
289
311
  'dvtm_AVATA2_3-4-4-1' => {
290
312
  Name => 'GPSInfo',
291
313
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
292
314
  },
315
+ #
316
+ # Mavic 3
317
+ #
318
+ 'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
319
+ 'dvtm_wm265e_1-1-10' => 'Model',
320
+ 'dvtm_wm265e_2-2' => {
321
+ Name => 'FrameInfo',
322
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
323
+ },
324
+ # dvtm_wm265e_3-2-1-4 - model code?
325
+ 'dvtm_wm265e_3-2-2-1' => { Name => 'ISO', Format => 'float' },
326
+ 'dvtm_wm265e_3-2-3-1' => {
327
+ Name => 'ShutterSpeed',
328
+ Format => 'rational',
329
+ ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
330
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
331
+ },
332
+ # dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
333
+ 'dvtm_wm265e_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
334
+ 'dvtm_wm265e_3-3-4-1' => {
335
+ Name => 'GPSInfo',
336
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
337
+ },
338
+ 'dvtm_wm265e_3-3-3-1' => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val/10' },
339
+ 'dvtm_wm265e_3-3-3-2' => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val/10' },
340
+ 'dvtm_wm265e_3-3-3-3' => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val/10' },
341
+ 'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', ValueConv => '$val / 1000' },
342
+ 'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
343
+ 'dvtm_wm265e_3-4-3-1' => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
344
+ 'dvtm_wm265e_3-4-3-2' => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
345
+ 'dvtm_wm265e_3-4-3-3' => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
293
346
  );
294
347
 
295
348
  %Image::ExifTool::DJI::FrameInfo = (
@@ -22,7 +22,7 @@ use strict;
22
22
  use vars qw($VERSION);
23
23
  use Image::ExifTool qw(:DataAccess :Utils);
24
24
 
25
- $VERSION = '1.20';
25
+ $VERSION = '1.22';
26
26
 
27
27
  sub ProcessPEResources($$);
28
28
  sub ProcessPEVersion($$);
@@ -194,6 +194,8 @@ my %int32uTime = (
194
194
  Name => 'MachineType',
195
195
  PrintHex => 1,
196
196
  PrintConv => {
197
+ 0x0 => 'Unknown',
198
+ 0x01 => 'Target host',
197
199
  0x014c => 'Intel 386 or later, and compatibles',
198
200
  0x014d => 'Intel i860', #5
199
201
  0x0162 => 'MIPS R3000',
@@ -204,10 +206,12 @@ my %int32uTime = (
204
206
  0x0184 => 'Alpha AXP',
205
207
  0x01a2 => 'Hitachi SH3',
206
208
  0x01a3 => 'Hitachi SH3 DSP',
209
+ 0x01a4 => 'Hitachi SH3E',
207
210
  0x01a6 => 'Hitachi SH4',
208
211
  0x01a8 => 'Hitachi SH5',
209
212
  0x01c0 => 'ARM little endian',
210
213
  0x01c2 => 'Thumb',
214
+ 0x01c4 => 'Thumb 2 little endian',
211
215
  0x01d3 => 'Matsushita AM33',
212
216
  0x01f0 => 'PowerPC little endian',
213
217
  0x01f1 => 'PowerPC with floating point support',
@@ -217,16 +221,26 @@ my %int32uTime = (
217
221
  0x0284 => 'Alpha AXP 64-bit',
218
222
  0x0366 => 'MIPS with FPU',
219
223
  0x0466 => 'MIPS16 with FPU',
224
+ 0x0520 => 'Infineon Tricore',
220
225
  0x0ebc => 'EFI Byte Code',
226
+ 0x3a64 => 'Compiled Hybrid PE',
227
+ 0x5032 => 'RISC-V 32-bit',
228
+ 0x5064 => 'RISC-V 64-bit',
229
+ 0x5128 => 'RISC-V 128-bit',
230
+ 0x6232 => 'LoongArch 32-bit',
231
+ 0x6264 => 'LoongArch 64-bit',
221
232
  0x8664 => 'AMD AMD64',
222
233
  0x9041 => 'Mitsubishi M32R little endian',
234
+ 0xaa64 => 'ARM64 little endian',
223
235
  0xc0ee => 'clr pure MSIL',
236
+ 0x0cef => 'CEF',
237
+ 0xec20 => 'Dotnet 0xEC20'
224
238
  },
225
239
  },
226
240
  2 => { Name => 'TimeStamp', %int32uTime },
227
241
  9 => {
228
242
  Name => 'ImageFileCharacteristics',
229
- # ref https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_image_file_header
243
+ # ref https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-image_file_header
230
244
  PrintConv => { BITMASK => {
231
245
  0 => 'No relocs',
232
246
  1 => 'Executable',
@@ -1283,7 +1297,7 @@ sub ProcessEXE($$)
1283
1297
  # read the rest of the optional header if necessary
1284
1298
  my $optSize = Get16u(\$buff, 20);
1285
1299
  my $more = $optSize + 24 - $size;
1286
- my $magic;
1300
+ my $magic = 0;
1287
1301
  if ($more > 0) {
1288
1302
  if ($raf->Read($buf2, $more) == $more) {
1289
1303
  $buff .= $buf2;
@@ -71,7 +71,7 @@ package Image::ExifTool::Geolocation;
71
71
  use strict;
72
72
  use vars qw($VERSION $geoDir $altDir $dbInfo);
73
73
 
74
- $VERSION = '1.08'; # (this is the module version number, not the database version)
74
+ $VERSION = '1.09'; # (this is the module version number, not the database version)
75
75
 
76
76
  my $debug; # set to output processing time for testing
77
77
 
@@ -463,7 +463,7 @@ sub GetAltNames($;$)
463
463
  sub Geolocate($;$)
464
464
  {
465
465
  my ($arg, $opts) = @_;
466
- my ($city, @exact, %regex, @multiCity, $other, $idx, @cargs, $useLastFound);
466
+ my ($city, @exact, %regex, @multiCity, $other, $idx, @cargs);
467
467
  my ($minPop, $minDistU, $minDistC, @matchParms, @coords, %fcOK, $both);
468
468
  my ($pop, $maxDist, $multi, $fcodes, $altNames, @startTime);
469
469
 
@@ -594,8 +594,16 @@ Entry: for (; $i<@cityList; ++$i) {
594
594
  }
595
595
  @startTime and printf("= Processing time: %.3f sec\n", Time::HiRes::tv_interval(\@startTime));
596
596
  if (%lastFound) {
597
- @coords == 2 and $useLastFound = 1, last; # continue to use coords with last city matches
597
+ last if @coords == 2; # continue to use coords with last city matches
598
598
  scalar(keys %lastFound) > 200 and warn("Too many matching cities\n"), return();
599
+ # return nearby cities if "num=" is used and only one match found
600
+ if ($num > 1 and scalar(keys %lastFound) == 1) {
601
+ my ($i) = keys %lastFound;
602
+ my @entry = GetEntry($i);
603
+ @coords = @entry[8,9];
604
+ SortDatabase('Latitude'); # (make sure we are sorted by latitude)
605
+ last;
606
+ }
599
607
  unless (@lastByPop) {
600
608
  @lastByPop = sort { $lastFound{$b} cmp $lastFound{$a} or $cityList[$a] cmp $cityList[$b] } keys %lastFound;
601
609
  }
@@ -777,7 +785,7 @@ on the first call.
777
785
 
778
786
  Sort database in specified order.
779
787
 
780
- Image::ExifTool::Geolocation::ReadDatabase('City');
788
+ Image::ExifTool::Geolocation::SortDatabase('City');
781
789
 
782
790
  =over 4
783
791
 
@@ -924,9 +932,10 @@ to the argument list:
924
932
  both to determine the closest city matching the specified
925
933
  name(s) instead of using GPS only.
926
934
 
927
- 'num=##' - When the search includes GPS coordinates, return the nearest
928
- ## cities instead of just the closest one. Returned cities
929
- are in the order from nearest to farthest.
935
+ 'num=##' - When the search includes GPS coordinates, or when a single
936
+ city is matched by name, return the nearest ## cities instead
937
+ of just the closest or named one. Returned cities are in the
938
+ order from nearest to farthest.
930
939
 
931
940
  See L<https://exiftool.org/geolocation.html#Read> for more details.
932
941
 
@@ -18,7 +18,7 @@ use strict;
18
18
  use vars qw($VERSION);
19
19
  use Image::ExifTool qw(:DataAccess :Utils);
20
20
 
21
- $VERSION = '1.62';
21
+ $VERSION = '1.63';
22
22
 
23
23
  sub ProcessID3v2($$$);
24
24
  sub ProcessPrivate($$$);
@@ -1278,9 +1278,9 @@ sub ProcessID3v2($$$)
1278
1278
  my $enc = unpack('C', $val);
1279
1279
  my ($tag, $url);
1280
1280
  if ($enc == 1 or $enc == 2) {
1281
- ($tag, $url) = ($tag =~ /^(.(?:..)*?)\0\0(.*)/s);
1281
+ ($tag, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/s);
1282
1282
  } else {
1283
- ($tag, $url) = ($tag =~ /^(..*?)\0(.*)/s);
1283
+ ($tag, $url) = ($val =~ /^(..*?)\0(.*)/s);
1284
1284
  }
1285
1285
  unless (defined $tag and defined $url) {
1286
1286
  $et->Warn("Invalid $id frame value");
@@ -1293,7 +1293,7 @@ sub ProcessID3v2($$$)
1293
1293
  $tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($tag));
1294
1294
  }
1295
1295
  $url =~ s/\0.*//s;
1296
- $val = $url;
1296
+ $val = $et->Decode($url, 'Latin');
1297
1297
  } elsif ($id =~ /^W/) {
1298
1298
  $val =~ s/\0.*//s; # truncate at null
1299
1299
  } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
@@ -11,7 +11,7 @@ use strict;
11
11
  use vars qw($VERSION);
12
12
  use Image::ExifTool qw(:DataAccess :Utils);
13
13
 
14
- $VERSION = '1.38';
14
+ $VERSION = '1.39';
15
15
 
16
16
  sub ProcessOcad($$$);
17
17
  sub ProcessJPEG_HDR($$$);
@@ -347,6 +347,10 @@ sub ProcessJPEG_HDR($$$);
347
347
  Name => 'Samsung',
348
348
  Condition => '$$valPt =~ /QDIOBS$/',
349
349
  SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' },
350
+ }, {
351
+ Name => 'Vivo',
352
+ Condition => '$$valPt =~ /^(streamdata|vivo\{")/',
353
+ SubDirectory => { TagTable => 'Image::ExifTool::Vivo::Main' },
350
354
  }, {
351
355
  Name => 'EmbeddedVideo',
352
356
  Notes => 'extracted only when ExtractEmbedded option is used',
@@ -269,6 +269,7 @@ sub ParseLigoGPS($$$;$)
269
269
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
270
270
  # 3) 1=LIGOGPS lat/lon/spd weren't fuzzed
271
271
  # Returns: 1 on success
272
+ # Notes: The directory data should start with the string "LIGOGPSINFO\0"
272
273
  sub ProcessLigoGPS($$$;$)
273
274
  {
274
275
  my ($et, $dirInfo, $tagTbl, $noFuzz) = @_;
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::Exif;
15
15
  use Image::ExifTool::GPS;
16
16
 
17
- $VERSION = '1.55';
17
+ $VERSION = '1.56';
18
18
 
19
19
  sub ProcessMIE($$);
20
20
  sub ProcessMIEGroup($$$);
@@ -1376,8 +1376,9 @@ sub WriteMIEGroup($$$)
1376
1376
  my $term = "~\0\0\0";
1377
1377
  unless ($$dirInfo{Parent}) {
1378
1378
  # write extended terminator for file-level group
1379
- my $len = ref $outfile eq 'SCALAR' ? length($$outfile) : tell $outfile;
1380
- $len += 10; # include length of terminator itself
1379
+ my $len = ref $outfile eq 'SCALAR' ? length($$outfile) || 0 : tell $outfile;
1380
+ # include length of terminator itself minus original $outfile position
1381
+ $len += 10 - ($$dirInfo{OutPos} || 0);
1381
1382
  if ($len and $len <= 0x7fffffff) {
1382
1383
  $term = "~\0\0\x06" . Set32u($len) . MIEGroupFormat(1) . "\x04";
1383
1384
  }
@@ -1802,6 +1803,8 @@ sub ProcessMIE($$)
1802
1803
  # don't define Parent so WriteMIEGroup() writes extended terminator
1803
1804
  );
1804
1805
  if ($outfile) {
1806
+ # save start position in $outfile
1807
+ $subdirInfo{OutPos} = ref $outfile eq 'SCALAR' ? length($$outfile) || 0 : tell $outfile;
1805
1808
  # generate lookup for MIE format codes if not done already
1806
1809
  unless (%mieCode) {
1807
1810
  foreach (keys %mieFormat) {