exiftool-vendored.exe 13.17.0 → 13.26.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 (49) hide show
  1. package/bin/README.txt +14 -14
  2. package/bin/exiftool.exe +0 -0
  3. package/bin/exiftool_files/exiftool.pl +117 -46
  4. package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +12 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +2 -2
  6. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +3 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +1 -1
  8. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +190 -29
  9. package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +22 -11
  10. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +2 -9
  11. package/bin/exiftool_files/lib/Image/ExifTool/GM.pm +1 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +3 -3
  13. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
  14. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +86 -48
  15. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +1 -0
  16. package/bin/exiftool_files/lib/Image/ExifTool/ICO.pm +2 -2
  17. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +5 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +5 -1
  19. package/bin/exiftool_files/lib/Image/ExifTool/Kodak.pm +3 -2
  20. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +944 -1237
  21. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +3 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/PCAP.pm +462 -0
  23. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +10 -1
  24. package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +92 -29
  25. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -1
  26. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +2 -1
  27. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +2 -2
  28. package/bin/exiftool_files/lib/Image/ExifTool/Plot.pm +713 -0
  29. package/bin/exiftool_files/lib/Image/ExifTool/Protobuf.pm +24 -11
  30. package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +78 -1
  31. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +371 -324
  32. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +75 -27
  33. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +15 -6
  34. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +33 -14
  35. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +5067 -4967
  36. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +457 -336
  37. package/bin/exiftool_files/lib/Image/ExifTool/Trailer.pm +3 -3
  38. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +4 -4
  39. package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  40. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +9 -4
  41. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
  42. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +58 -5
  43. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +14 -13
  44. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +55 -20
  45. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +7 -1
  46. package/bin/exiftool_files/lib/Image/ExifTool.pm +63 -29
  47. package/bin/exiftool_files/lib/Image/ExifTool.pod +84 -86
  48. package/bin/exiftool_files/windows_exiftool.txt +96 -72
  49. package/package.json +4 -4
package/bin/README.txt CHANGED
@@ -1,14 +1,14 @@
1
-
2
- ExifTool package for 64-bit Windows
3
- ___________________________________
4
-
5
- Double-click on "exiftool(-k).exe" to read the application documentation, or
6
- drag-and-drop files to extract metadata.
7
-
8
- For command-line use, rename to "exiftool.exe".
9
-
10
- Run directly in from the exiftool-##.##_64 folder, or copy the .exe and the
11
- "exiftool_files" folder to wherever you want (preferably somewhere in your
12
- PATH) to run from there.
13
-
14
- See https://exiftool.org/install.html for more installation instructions.
1
+
2
+ ExifTool package for 64-bit Windows
3
+ ___________________________________
4
+
5
+ Double-click on "exiftool(-k).exe" to read the application documentation, or
6
+ drag-and-drop files to extract metadata.
7
+
8
+ For command-line use, rename to "exiftool.exe".
9
+
10
+ Run directly in from the exiftool-##.##_64 folder, or copy the .exe and the
11
+ "exiftool_files" folder to wherever you want (preferably somewhere in your
12
+ PATH) to run from there.
13
+
14
+ See https://exiftool.org/install.html for more installation instructions.
package/bin/exiftool.exe CHANGED
Binary file
@@ -11,7 +11,9 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.17';
14
+ my $version = '13.26';
15
+
16
+ $^W = 1; # enable global warnings
15
17
 
16
18
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
19
  my $exePath;
@@ -43,7 +45,7 @@ sub EncodeXML($);
43
45
  sub FormatXML($$$);
44
46
  sub EscapeJSON($;$);
45
47
  sub FormatJSON($$$;$);
46
- sub PrintCSV();
48
+ sub PrintCSV(;$);
47
49
  sub AddGroups($$$$);
48
50
  sub ConvertBinary($);
49
51
  sub IsEqual($$);
@@ -181,6 +183,7 @@ my $outFormat; # -1=Canon format, 0=same-line, 1=tag names, 2=values only
181
183
  my $outOpt; # output file or directory name
182
184
  my $overwriteOrig; # flag to overwrite original file (1=overwrite, 2=in place)
183
185
  my $pause; # pause before returning
186
+ my $plot; # flag for plot output format
184
187
  my $preserveTime; # flag to preserve times of updated files (2=preserve FileCreateDate only)
185
188
  my $progress; # flag to calculate total files to process (0=calculate but don't display)
186
189
  my $progressCount; # count of files processed
@@ -208,6 +211,7 @@ my $structOpt; # output structured XMP information (JSON and XML output onl
208
211
  my $tabFormat; # non-zero for tab output format
209
212
  my $tagOut; # flag for separate text output file for each tag
210
213
  my $textOut; # extension for text output file (or undef for no output)
214
+ my $textOut2; # complete file name for single text output file
211
215
  my $textOverwrite; # flag to overwrite existing text output file (2=append, 3=over+append)
212
216
  my $tmpFile; # temporary file to delete on exit
213
217
  my $tmpText; # temporary text file
@@ -472,8 +476,8 @@ undef %filterExt;
472
476
  undef %ignore;
473
477
  undef %outComma;
474
478
  undef %outTrailer;
475
- undef %printFmt;
476
479
  undef %preserveTime;
480
+ undef %printFmt;
477
481
  undef %seqFileDir;
478
482
  undef %setTags;
479
483
  undef %setTagsList;
@@ -1189,6 +1193,7 @@ for (;;) {
1189
1193
  }
1190
1194
  /^overwrite_original$/i and $overwriteOrig = 1, next;
1191
1195
  /^overwrite_original_in_place$/i and $overwriteOrig = 2, next;
1196
+ /^plot$/i and require Image::ExifTool::Plot and $plot = Image::ExifTool::Plot->new, next;
1192
1197
  if (/^p(-?)$/ or /^printformat(-?)$/i) {
1193
1198
  my $fmt = shift;
1194
1199
  if ($pass) {
@@ -1404,7 +1409,8 @@ for (;;) {
1404
1409
  # add geotag/geosync/geolocate commands first
1405
1410
  unshift @newValues, pop @newValues;
1406
1411
  if (lc $2 eq 'geotag' and (not defined $addGeotime or $addGeotime) and length $val) {
1407
- $addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal#';
1412
+ $addGeotime = [ ($1 || '') . 'Geotime<DateTimeOriginal#',
1413
+ ($1 || '') . 'Geotime<SubSecDateTimeOriginal#' ];
1408
1414
  }
1409
1415
  }
1410
1416
  }
@@ -1495,38 +1501,34 @@ unless ((@tags and not $outOpt) or @files or @newValues or $geoOnly) {
1495
1501
  if (defined $deleteOrig and (@newValues or @tags)) {
1496
1502
  if (not @newValues) {
1497
1503
  my $verb = $deleteOrig ? 'deleting' : 'restoring from';
1498
- Warn "Can't specify tags when $verb originals\n";
1504
+ Error "Can't specify tags when $verb originals\n";
1499
1505
  } elsif ($deleteOrig) {
1500
- Warn "Can't use -delete_original when writing.\n";
1501
- Warn "Maybe you meant -overwrite_original ?\n";
1506
+ Error "Can't use -delete_original when writing.\n";
1507
+ Error "Maybe you meant -overwrite_original ?\n";
1502
1508
  } else {
1503
- Warn "It makes no sense to use -restore_original when writing\n";
1509
+ Error "It makes no sense to use -restore_original when writing\n";
1504
1510
  }
1505
- $rtnVal = 1;
1506
1511
  next;
1507
1512
  }
1508
1513
 
1509
1514
  if ($overwriteOrig > 1 and $outOpt) {
1510
- Warn "Can't overwrite in place when -o option is used\n";
1511
- $rtnVal = 1;
1515
+ Error "Can't overwrite in place when -o option is used\n";
1512
1516
  next;
1513
1517
  }
1514
1518
 
1515
- if (($tagOut or defined $diff) and ($csv or $json or %printFmt or $tabFormat or $xml or
1519
+ if (($tagOut or defined $diff) and ($csv or $json or %printFmt or $tabFormat or $xml or $plot or
1516
1520
  ($verbose and $html)))
1517
1521
  {
1518
1522
  my $opt = $tagOut ? '-W' : '-diff';
1519
- Warn "Sorry, $opt may not be combined with -csv, -htmlDump, -j, -p, -t or -X\n";
1520
- $rtnVal = 1;
1523
+ Error "Sorry, $opt may not be combined with -csv, -htmlDump, -j, -p, -t or -X\n";
1521
1524
  next;
1522
1525
  }
1523
1526
 
1524
1527
  if ($csv and $csv eq 'CSV' and not $isWriting) {
1525
1528
  $json = 0; # (not compatible)
1526
1529
  if ($textOut) {
1527
- Warn "Sorry, -w may not be combined with -csv\n";
1528
- $rtnVal = 1;
1529
- next;
1530
+ $textOut2 = $textOut;
1531
+ undef $textOut;
1530
1532
  }
1531
1533
  if ($binaryOutput) {
1532
1534
  $binaryOutput = 0;
@@ -1538,6 +1540,32 @@ if ($csv and $csv eq 'CSV' and not $isWriting) {
1538
1540
  }
1539
1541
  require Image::ExifTool::XMP if $setCharset;
1540
1542
  }
1543
+ if ($plot and $textOut) {
1544
+ $textOut2 = $textOut;
1545
+ undef $textOut;
1546
+ }
1547
+ if ($textOut2) {
1548
+ if ($textOverwrite > 1) {
1549
+ Error "Can not append to multi-file output format\n";
1550
+ undef $textOut2;
1551
+ next;
1552
+ }
1553
+ if (not $textOverwrite and $mt->Exists($textOut2, 1)) {
1554
+ Error "Output file $textOut2 already exists\n";
1555
+ undef $textOut2;
1556
+ next;
1557
+ }
1558
+ # make sure we can write the output text file before processing all input files
1559
+ CreateDirectory($textOut2); # create directory if necessary
1560
+ if ($mt->Open(\*OUTFILE, $textOut2, '>')) {
1561
+ close(\*OUTFILE);
1562
+ unlink($textOut2); # (this was just a test)
1563
+ } else {
1564
+ Error("Error creating $textOut2\n");
1565
+ undef $textOut2;
1566
+ next;
1567
+ }
1568
+ }
1541
1569
 
1542
1570
  if ($escapeHTML or $json) {
1543
1571
  # must be UTF8 for HTML conversion and JSON output
@@ -1551,7 +1579,7 @@ if ($escapeHTML or $json) {
1551
1579
  # set sort option
1552
1580
  if ($sortOpt) {
1553
1581
  # (note that -csv sorts alphabetically by default anyway if more than 1 file)
1554
- my $sort = ($outFormat > 0 or $xml or $json or $csv) ? 'Tag' : 'Descr';
1582
+ my $sort = ($outFormat > 0 or $xml or $json or $csv or $plot) ? 'Tag' : 'Descr';
1555
1583
  $mt->Options(Sort => $sort, Sort2 => $sort);
1556
1584
  }
1557
1585
 
@@ -1562,7 +1590,11 @@ if ($mt->Options('Struct') and not $structOpt) {
1562
1590
  }
1563
1591
 
1564
1592
  # set up for RDF/XML, JSON and PHP output formats
1565
- if ($xml) {
1593
+ if ($plot) {
1594
+ undef $joinLists;
1595
+ $mt->Options(List => 1);
1596
+ $plot->Settings($mt->Options('Plot'));
1597
+ } elsif ($xml) {
1566
1598
  require Image::ExifTool::XMP; # for EscapeXML()
1567
1599
  my $charset = $mt->Options('Charset');
1568
1600
  # standard XML encoding names for supported Charset settings
@@ -1634,11 +1666,10 @@ if (Image::ExifTool::IsPC()) {
1634
1666
  unless (@files) {
1635
1667
  unless ($outOpt) {
1636
1668
  if ($doGlob and $doGlob == 2) {
1637
- Warn "No matching files\n";
1669
+ Error "No matching files\n";
1638
1670
  } else {
1639
- Warn "No file specified\n";
1671
+ Error "No file specified\n";
1640
1672
  }
1641
- $rtnVal = 1;
1642
1673
  next;
1643
1674
  }
1644
1675
  push @files, ''; # create file from nothing
@@ -1667,8 +1698,9 @@ if (@newValues) {
1667
1698
  # assume -geotime value if -geotag specified without -geotime
1668
1699
  if ($addGeotime) {
1669
1700
  AddSetTagsFile($setTagsFile = '@') unless $setTagsFile and $setTagsFile eq '@';
1670
- push @{$setTags{$setTagsFile}}, $addGeotime;
1671
- $verbose and print $vout qq{Argument "-$addGeotime" is assumed\n};
1701
+ push @{$setTags{$setTagsFile}}, @$addGeotime;
1702
+ my @a = map qq("-$_"), @$addGeotime;
1703
+ $verbose and print $vout 'Arguments ',join(' and ', @a)," are assumed\n";
1672
1704
  }
1673
1705
  my %setTagsIndex;
1674
1706
  # add/delete option lookup
@@ -1700,8 +1732,7 @@ if (@newValues) {
1700
1732
  next; # set tags from dynamic file later
1701
1733
  }
1702
1734
  unless ($mt->Exists($newVal) or $newVal eq '-') {
1703
- Warn "File '${newVal}' does not exist for -tagsFromFile option\n";
1704
- $rtnVal = 1;
1735
+ Error "File '${newVal}' does not exist for -tagsFromFile option\n";
1705
1736
  next Command;
1706
1737
  }
1707
1738
  my $setTags = $setTags{$newVal};
@@ -1765,19 +1796,20 @@ if (@newValues) {
1765
1796
  }
1766
1797
  }
1767
1798
  unless ($isWriting or $outOpt or @tags) {
1768
- Warn "Nothing to do.\n";
1769
- $rtnVal = 1;
1799
+ Error "Nothing to do.\n";
1770
1800
  next;
1771
1801
  }
1772
1802
  } elsif (grep /^(\*:)?\*$/, @exclude) {
1773
- Warn "All tags excluded -- nothing to do.\n";
1774
- $rtnVal = 1;
1803
+ Error "All tags excluded -- nothing to do.\n";
1775
1804
  next;
1776
1805
  }
1777
1806
  if ($isWriting) {
1778
1807
  if (defined $diff) {
1779
1808
  Error "Can't use -diff option when writing tags\n";
1780
1809
  next;
1810
+ } elsif ($plot) {
1811
+ Error "Can't use -plot option when writing tags\n";
1812
+ next;
1781
1813
  } elsif (@tags and not $outOpt and not $csv) {
1782
1814
  my ($tg, $s) = @tags > 1 ? ("$tags[0] ...", 's') : ($tags[0], '');
1783
1815
  Warn "Ignored superfluous tag name$s or invalid option$s: -$tg\n";
@@ -1926,9 +1958,6 @@ ProcessFiles($mt);
1926
1958
 
1927
1959
  Error "No file with specified extension\n" if $filtered and not $validFile;
1928
1960
 
1929
- # print CSV information if necessary
1930
- PrintCSV() if $csv and not $isWriting;
1931
-
1932
1961
  # print folder/file trailer if necessary
1933
1962
  if ($textOut) {
1934
1963
  foreach (keys %outTrailer) {
@@ -1944,6 +1973,37 @@ if ($textOut) {
1944
1973
  } else {
1945
1974
  print $sectTrailer if $sectTrailer;
1946
1975
  print $fileTrailer if $fileTrailer and not $fileHeader;
1976
+ # print CSV or SVG output file if necessary
1977
+ my ($fp, $err);
1978
+ if ($textOut2) {
1979
+ if ($mt->Open(\*OUTFILE, $textOut2, '>')) {
1980
+ $fp = \*OUTFILE;
1981
+ } else {
1982
+ Error("Error creating $textOut2\n");
1983
+ $err = 1;
1984
+ }
1985
+ }
1986
+ unless ($err) {
1987
+ PrintCSV($fp) if $csv and not $isWriting;
1988
+ # print SVG plot
1989
+ if ($plot) {
1990
+ $plot->Draw($fp || \*STDOUT);
1991
+ if ($$plot{Error}) {
1992
+ Error("Error: $$plot{Error}\n");
1993
+ $err = 1;
1994
+ } elsif ($$plot{Warn}) {
1995
+ Warn("Warning: $$plot{Warn}\n");
1996
+ }
1997
+ }
1998
+ }
1999
+ if ($fp) {
2000
+ close($fp) or $err = 1;
2001
+ if ($err) {
2002
+ $mt->Unlink($textOut2);
2003
+ } else {
2004
+ $created{$textOut2} = 1;
2005
+ }
2006
+ }
1947
2007
  }
1948
2008
 
1949
2009
  my $totWr = $countGoodWr + $countBadWr + $countSameWr + $countCopyWr +
@@ -1988,7 +2048,7 @@ if (defined $deleteOrig) {
1988
2048
  # print summary
1989
2049
  my $tot = $count + $countBad;
1990
2050
  if ($countDir or $totWr or $countFailed or $tot > 1 or $textOut or %countLink) {
1991
- my $o = (($html or $json or $xml or %printFmt or $csv) and not $textOut) ? \*STDERR : $vout;
2051
+ my $o = (($html or $json or $xml or %printFmt or $csv or $plot) and not $textOut) ? \*STDERR : $vout;
1992
2052
  printf($o "%5d directories scanned\n", $countDir) if $countDir;
1993
2053
  printf($o "%5d directories created\n", $countNewDir) if $countNewDir;
1994
2054
  printf($o "%5d files failed condition\n", $countFailed) if $countFailed;
@@ -2000,7 +2060,7 @@ if (defined $deleteOrig) {
2000
2060
  printf($o "%5d files weren't created due to errors\n", $countBadCr) if $countBadCr;
2001
2061
  printf($o "%5d image files read\n", $count) if ($tot+$countFailed)>1 or ($countDir and not $totWr);
2002
2062
  printf($o "%5d files could not be read\n", $countBad) if $countBad;
2003
- printf($o "%5d output files created\n", scalar(keys %created)) if $textOut;
2063
+ printf($o "%5d output files created\n", scalar(keys %created)) if $textOut or $textOut2;
2004
2064
  printf($o "%5d output files appended\n", scalar(keys %appended)) if %appended;
2005
2065
  printf($o "%5d hard links created\n", $countLink{Hard} || 0) if $countLink{Hard} or $countLink{BadHard};
2006
2066
  printf($o "%5d hard links could not be created\n", $countLink{BadHard}) if $countLink{BadHard};
@@ -2205,7 +2265,7 @@ sub GetImageInfo($$)
2205
2265
 
2206
2266
  my $lineCount = 0;
2207
2267
  my ($fp, $outfile, $append);
2208
- if ($textOut and ($verbose or $et->Options('PrintCSV')) and not ($tagOut or defined $diff)) {
2268
+ if ($textOut and ($verbose or $et->Options('PrintCSV')) and not ($tagOut or defined $diff or $plot)) {
2209
2269
  ($fp, $outfile, $append) = OpenOutputFile($orig);
2210
2270
  $fp or EFile($file), ++$countBad, return;
2211
2271
  # delete file if we exit prematurely (unless appending)
@@ -2245,7 +2305,7 @@ sub GetImageInfo($$)
2245
2305
  }
2246
2306
  # print file/progress message
2247
2307
  my $o;
2248
- unless ($binaryOutput or $textOut or %printFmt or $html > 1 or $csv) {
2308
+ unless ($binaryOutput or $textOut or %printFmt or $html > 1 or $csv or $plot) {
2249
2309
  if ($html) {
2250
2310
  require Image::ExifTool::HTML;
2251
2311
  my $f = Image::ExifTool::HTML::EscapeHTML($file);
@@ -2348,7 +2408,7 @@ sub GetImageInfo($$)
2348
2408
  unless (defined $outfile or $tagOut) {
2349
2409
  ($fp, $outfile, $append) = OpenOutputFile($orig);
2350
2410
  $fp or EFile($file), ++$countBad, return;
2351
- $tmpText = $outfile unless $append;
2411
+ $tmpText = $outfile if defined $outfile and not $append;
2352
2412
  }
2353
2413
 
2354
2414
  # print differences if requested
@@ -2459,9 +2519,8 @@ T2: foreach $t2 (@tags2) {
2459
2519
  $done2{$tag2} = 1 if defined $tag2;
2460
2520
  }
2461
2521
  print $fp "(no metadata differences)\n" unless $wasDiff;
2462
- undef $tmpText;
2463
2522
  if (defined $outfile) {
2464
- ++$created{$outfile};
2523
+ $created{$outfile} = 1;
2465
2524
  close($fp);
2466
2525
  undef $tmpText;
2467
2526
  }
@@ -2536,6 +2595,17 @@ T2: foreach $t2 (@tags2) {
2536
2595
  delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
2537
2596
  my $errs = $et->GetInfo('Warning', 'Error');
2538
2597
  PrintErrors($et, $errs, $file) and EFile($file);
2598
+ } elsif ($plot) {
2599
+ # add points from this file to the plot
2600
+ my $tagExtra = $$et{TAG_EXTRA};
2601
+ my ($tag, %docNum);
2602
+ foreach $tag (keys %$info) {
2603
+ next unless $$tagExtra{$tag} and $$tagExtra{$tag}{G3};
2604
+ $docNum{$tag} = $1 if $$tagExtra{$tag}{G3} =~ /(\d+)/;
2605
+ }
2606
+ $$plot{DocNum} = \%docNum;
2607
+ $$plot{EE} = 1 if $et->Options('ExtractEmbedded');
2608
+ $plot->AddPoints($info, \@foundTags);
2539
2609
  } elsif (not $disableOutput) {
2540
2610
  my ($tag, $line, %noDups, %csvInfo, $bra, $ket, $sep, $quote);
2541
2611
  if ($fp) {
@@ -3768,8 +3838,10 @@ sub FormatCSV($)
3768
3838
 
3769
3839
  #------------------------------------------------------------------------------
3770
3840
  # Print accumulated CSV information
3771
- sub PrintCSV()
3841
+ # Inputs: 0) file ref
3842
+ sub PrintCSV(;$)
3772
3843
  {
3844
+ my $fp = shift || \*STDOUT;
3773
3845
  my ($file, $lcTag, @tags);
3774
3846
 
3775
3847
  @csvTags or @csvTags = sort keys %csvTags;
@@ -3777,7 +3849,7 @@ sub PrintCSV()
3777
3849
  foreach $lcTag (@csvTags) {
3778
3850
  push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
3779
3851
  }
3780
- print join($csvDelim, 'SourceFile', @tags), "\n";
3852
+ print $fp join($csvDelim, 'SourceFile', @tags), "\n";
3781
3853
  my $empty = defined($forcePrint) ? $forcePrint : '';
3782
3854
  foreach $file (@csvFiles) {
3783
3855
  my @vals = (FormatCSV($file)); # start with full file name
@@ -3788,7 +3860,7 @@ sub PrintCSV()
3788
3860
  defined $val or push(@vals,$empty), next;
3789
3861
  push @vals, FormatCSV($val);
3790
3862
  }
3791
- print join($csvDelim, @vals), "\n";
3863
+ print $fp join($csvDelim, @vals), "\n";
3792
3864
  }
3793
3865
  }
3794
3866
 
@@ -4122,9 +4194,8 @@ sub ProcessFiles($;$)
4122
4194
  $filtered = 1;
4123
4195
  Progress($vout, "-------- $file (wrong extension)") if $verbose;
4124
4196
  } else {
4125
- Warn "Error: File not found - $file\n";
4197
+ Error "Error: File not found - $file\n";
4126
4198
  FileNotFound($file);
4127
- $rtnVal = 1;
4128
4199
  }
4129
4200
  } else {
4130
4201
  $validFile = 1;
@@ -4883,7 +4954,7 @@ sub PrintTagList($@)
4883
4954
  my $msg = shift;
4884
4955
  print $msg, ":\n" unless $quiet;
4885
4956
  my $tag;
4886
- if ($outFormat < 0 and $msg =~ /file extensions$/ and @_) {
4957
+ if (($outFormat < 0 or $verbose) and $msg =~ /file extensions$/ and @_) {
4887
4958
  foreach $tag (@_) {
4888
4959
  printf(" %-11s %s\n", $tag, GetFileType($tag, 1));
4889
4960
  }
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool::Exif;
17
17
  use Image::ExifTool::PLIST;
18
18
 
19
- $VERSION = '1.14';
19
+ $VERSION = '1.15';
20
20
 
21
21
  sub ConvertPLIST($$);
22
22
 
@@ -307,7 +307,17 @@ sub ConvertPLIST($$);
307
307
  Name => 'Apple_0x004f',
308
308
  Unknown => 1,
309
309
  ValueConv => \&ConvertPLIST,
310
- }
310
+ },
311
+ 0x0054 => {
312
+ Name => 'Apple_0x0054',
313
+ Unknown => 1,
314
+ ValueConv => \&ConvertPLIST,
315
+ },
316
+ 0x005a => {
317
+ Name => 'Apple_0x005a',
318
+ Unknown => 1,
319
+ ValueConv => \&ConvertPLIST,
320
+ },
311
321
  );
312
322
 
313
323
  # PLIST-format CMTime structure (ref PH)
@@ -1795,8 +1795,8 @@ sub NumbersFirst($$)
1795
1795
  my ($a2, $b2) = ($a, $b);
1796
1796
  # expand numbers to 3 digits (with restrictions to avoid messing up
1797
1797
  # ascii-hex tags -- Nikon LensID's are 23 characters long)
1798
- $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP|DMC-\w+ |dvtm_.*)?[.0-9 ]*$/ and length($a2)<23;
1799
- $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP|DMC-\w+ |dvtm_.*)?[.0-9 ]*$/ and length($b2)<23;
1798
+ $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP|DMC-\w+ |dvtm_.*|(IDB|SHB)-)?[.0-9 ]*$/ and length($a2)<23;
1799
+ $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP|DMC-\w+ |dvtm_.*|(IDB|SHB)-)?[.0-9 ]*$/ and length($b2)<23;
1800
1800
  $caseInsensitive and $rtnVal = (lc($a2) cmp lc($b2));
1801
1801
  $rtnVal or $rtnVal = ($a2 cmp $b2);
1802
1802
  }
@@ -2053,7 +2053,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2053
2053
  # 0x4014 (similar to 0x83?)
2054
2054
  0x4015 => [{
2055
2055
  Name => 'VignettingCorr', # (LensPacket)
2056
- Condition => '$$valPt =~ /^\0/ and $$valPt !~ /^\0\0\0\0/', # (data may be all zeros for 60D)
2056
+ Condition => '$$valPt =~ /^\0/ and $$valPt !~ /^(\0\0\0\0|\x00\x40\xdc\x05)/', # (data may be all zeros for 60D)
2057
2057
  SubDirectory => {
2058
2058
  # (the size word is at byte 2 in this structure)
2059
2059
  Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
@@ -2061,7 +2061,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2061
2061
  },
2062
2062
  },{
2063
2063
  Name => 'VignettingCorrUnknown1',
2064
- Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~ /^\0\0\0\0/',
2064
+ Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~ /^(\0\0\0\0|\x02\x50\x7c\x04)/',
2065
2065
  SubDirectory => {
2066
2066
  # (the size word is at byte 2 in this structure)
2067
2067
  Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
@@ -4758,6 +4758,7 @@ my %ciMaxFocal = (
4758
4758
  Format => 'int32u',
4759
4759
  Notes => 'includes electronic + mechanical shutter',
4760
4760
  },
4761
+ # 0x0b5a - related to image stabilization (ref forum17239) (R5)
4761
4762
  # 0x0bb7 - counts down during focus stack (ref forum16111)
4762
4763
  );
4763
4764
 
@@ -854,7 +854,7 @@ sub ProcessCRW($$)
854
854
 
855
855
  # process trailers if they exist in CRW file (not in CIFF information!)
856
856
  if ($$et{FILE_TYPE} eq 'CRW') {
857
- my $trailInfo = Image::ExifTool::IdentifyTrailer($raf);
857
+ my $trailInfo = $et->IdentifyTrailer($raf);
858
858
  $et->ProcessTrailers($trailInfo) if $trailInfo;
859
859
  }
860
860