exiftool-vendored.exe 12.67.0 → 12.70.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 (42) hide show
  1. package/bin/exiftool_files/Changes +79 -10
  2. package/bin/exiftool_files/README +7 -7
  3. package/bin/exiftool_files/exiftool.pl +37 -31
  4. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +18 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +87 -16
  6. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +3 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +25 -2
  8. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +54 -6
  9. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +175 -14
  10. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +158 -20
  11. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +5 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +16 -11
  13. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +70 -7
  14. package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  17. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +2 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +82 -22
  19. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +7 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +3 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +22 -9
  22. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +6 -1
  23. package/bin/exiftool_files/lib/Image/ExifTool/PhotoMechanic.pm +2 -1
  24. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +92 -55
  25. package/bin/exiftool_files/lib/Image/ExifTool/README +14 -5
  26. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +60 -10
  27. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +152 -46
  28. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6955 -6713
  29. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +878 -334
  30. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +4 -5
  31. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +23 -20
  32. package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
  33. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +14 -4
  34. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +3 -0
  35. package/bin/exiftool_files/lib/Image/ExifTool/WriteRIFF.pl +31 -6
  36. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +40 -14
  37. package/bin/exiftool_files/lib/Image/ExifTool/XISF.pm +185 -0
  38. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +67 -2
  39. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +35 -0
  40. package/bin/exiftool_files/lib/Image/ExifTool.pm +92 -45
  41. package/bin/exiftool_files/lib/Image/ExifTool.pod +14 -8
  42. package/package.json +3 -3
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.60';
53
+ $VERSION = '3.61';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -201,6 +201,8 @@ my %xmpNS = (
201
201
  nine => 'http://ns.nikon.com/nine/1.0/',
202
202
  hdr_metadata => 'http://ns.adobe.com/hdr-metadata/1.0/',
203
203
  hdrgm => 'http://ns.adobe.com/hdr-gain-map/1.0/',
204
+ # Note: Not included due to namespace prefix conflict with Device:Container
205
+ # Container => 'http://ns.google.com/photos/1.0/container/',
204
206
  );
205
207
 
206
208
  # build reverse namespace lookup
@@ -479,7 +481,7 @@ my %sCorrRangeMask = (
479
481
  LuminanceDepthSampleInfo => { },
480
482
  );
481
483
  # new LR2 crs structures (PH)
482
- my %sCorrectionMask;
484
+ my %sCorrectionMask; # (must define this before assigning because it is self-referential)
483
485
  %sCorrectionMask = (
484
486
  STRUCT_NAME => 'CorrectionMask',
485
487
  NAMESPACE => 'crs',
@@ -919,6 +921,11 @@ my %sRangeMask = (
919
921
  Name => 'hdrgm',
920
922
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::hdrgm' },
921
923
  },
924
+ # Note: Note included due to namespace prefix conflict with Device:Container
925
+ # Container => {
926
+ # Name => 'Container',
927
+ # SubDirectory => { TagTable => 'Image::ExifTool::XMP::Container' },
928
+ # },
922
929
  );
923
930
 
924
931
  # hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm)
@@ -1699,6 +1706,8 @@ my %sPantryItem = (
1699
1706
  ToneCurvePV2012Red => { List => 'Seq' },
1700
1707
  ToneCurvePV2012Green => { List => 'Seq' },
1701
1708
  ToneCurvePV2012Blue => { List => 'Seq' },
1709
+ Highlights2012 => { },
1710
+ Shadows2012 => { },
1702
1711
  },
1703
1712
  },
1704
1713
  }
@@ -1760,6 +1769,62 @@ my %sPantryItem = (
1760
1769
  SDRShadows => { Writable => 'real' },
1761
1770
  SDRWhites => { Writable => 'real' },
1762
1771
  SDRBlend => { Writable => 'real' },
1772
+ # new for ACR 16 (ref forum15305)
1773
+ LensBlur => {
1774
+ Struct => {
1775
+ STRUCT_NAME => 'LensBlur',
1776
+ NAMESPACE => 'crs',
1777
+ # (Note: all the following 'real' values could be limited to 'integer')
1778
+ Active => { Writable => 'boolean' },
1779
+ BlurAmount => { FlatName => 'Amount', Writable => 'real' },
1780
+ BokehAspect => { Writable => 'real' },
1781
+ BokehRotation => { Writable => 'real' },
1782
+ BokehShape => { Writable => 'real' },
1783
+ BokehShapeDetail => { Writable => 'real' },
1784
+ CatEyeAmount => { Writable => 'real' },
1785
+ CatEyeScale => { Writable => 'real' },
1786
+ FocalRange => { }, # (eg. "-48 32 64 144")
1787
+ FocalRangeSource => { Writable => 'real' },
1788
+ HighlightsBoost => { Writable => 'real' },
1789
+ HighlightsThreshold => { Writable => 'real' },
1790
+ SampledArea => { }, # (eg. "0.500000 0.500000 0.500000 0.500000")
1791
+ SampledRange => { }, # (eg. "0 0")
1792
+ SphericalAberration => { Writable => 'real' },
1793
+ SubjectRange => { }, # (eg. "0 57");
1794
+ Version => { },
1795
+ },
1796
+ },
1797
+ DepthMapInfo => {
1798
+ Struct => {
1799
+ STRUCT_NAME => 'DepthMapInfo',
1800
+ NAMESPACE => 'crs',
1801
+ BaseHighlightGuideInputDigest => { },
1802
+ BaseHighlightGuideTable => { },
1803
+ BaseHighlightGuideVersion => { },
1804
+ BaseLayeredDepthInputDigest => { },
1805
+ BaseLayeredDepthTable => { },
1806
+ BaseLayeredDepthVersion => { },
1807
+ BaseRawDepthInputDigest => { },
1808
+ BaseRawDepthTable => { },
1809
+ BaseRawDepthVersion => { },
1810
+ DepthSource => { },
1811
+ },
1812
+ },
1813
+ DepthBasedCorrections => {
1814
+ List => 'Seq',
1815
+ FlatName => 'DepthBasedCorr',
1816
+ Struct => {
1817
+ STRUCT_NAME => 'DepthBasedCorr',
1818
+ NAMESPACE => 'crs',
1819
+ CorrectionActive => { Writable => 'boolean' },
1820
+ CorrectionAmount => { Writable => 'real' },
1821
+ CorrectionMasks => { FlatName => 'Mask', List => 'Seq', Struct => \%sCorrectionMask },
1822
+ CorrectionSyncID => { },
1823
+ LocalCorrectedDepth => { Writable => 'real' },
1824
+ LocalCurveRefineSaturation => { Writable => 'real' },
1825
+ What => { },
1826
+ },
1827
+ },
1763
1828
  );
1764
1829
 
1765
1830
  # Tiff namespace properties (tiff)
@@ -1873,6 +1873,10 @@ my %sSubVersion = (
1873
1873
  ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
1874
1874
  ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
1875
1875
  },
1876
+ HdrPlusMakernote => {
1877
+ ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
1878
+ ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
1879
+ },
1876
1880
  );
1877
1881
 
1878
1882
  # Google creations namespace (ref PH)
@@ -2037,6 +2041,37 @@ my %sSubVersion = (
2037
2041
  },
2038
2042
  );
2039
2043
 
2044
+ # Google container tags (ref https://developer.android.com/guide/topics/media/platform/hdr-image-format)
2045
+ # NOTE: Not included because these namespace prefixes conflict with Google's depth-map Device tags!
2046
+ # (see ../pics/GooglePixel8Pro.jpg sample image)
2047
+ # %Image::ExifTool::XMP::Container = (
2048
+ # %xmpTableDefaults,
2049
+ # GROUPS => { 1 => 'XMP-Container', 2 => 'Image' },
2050
+ # NAMESPACE => 'Container',
2051
+ # NOTES => 'Google Container namespace.',
2052
+ # Directory => {
2053
+ # Name => 'ContainerDirectory',
2054
+ # FlatName => 'Directory',
2055
+ # List => 'Seq',
2056
+ # Struct => {
2057
+ # STRUCT_NAME => 'Directory',
2058
+ # Item => {
2059
+ # Namespace => 'Container',
2060
+ # Struct => {
2061
+ # STRUCT_NAME => 'Item',
2062
+ # NAMESPACE => { Item => 'http://ns.google.com/photos/1.0/container/item/'},
2063
+ # Mime => { },
2064
+ # Semantic => { },
2065
+ # Length => { Writable => 'integer' },
2066
+ # Label => { },
2067
+ # Padding => { Writable => 'integer' },
2068
+ # URI => { },
2069
+ # },
2070
+ # },
2071
+ # },
2072
+ # },
2073
+ # );
2074
+
2040
2075
  # Getty Images namespace (ref PH)
2041
2076
  %Image::ExifTool::XMP::GettyImages = (
2042
2077
  %xmpTableDefaults,
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars);
31
31
 
32
- $VERSION = '12.67';
32
+ $VERSION = '12.70';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -132,7 +132,7 @@ sub Rename($$$);
132
132
  sub Unlink($@);
133
133
  sub SetFileTime($$;$$$$);
134
134
  sub DoEscape($$);
135
- sub ConvertFileSize($);
135
+ sub ConvertFileSize($;$);
136
136
  sub ParseArguments($;@); #(defined in attempt to avoid mod_perl problem)
137
137
  sub ReadValue($$$;$$$);
138
138
 
@@ -145,16 +145,16 @@ sub ReadValue($$$;$$$);
145
145
  WPG ICO PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC LIF MRC::FEI12 MIFF
146
146
  PCX PGF PSP PhotoCD Radiance Other::PFM PDF PostScript Photoshop::Header
147
147
  Photoshop::Layers Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD
148
- Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3
149
- FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio
150
- MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile QuickTime::Stream
151
- QuickTime::Tags360Fly Matroska Matroska::StdTag MOI MXF DV Flash Flash::FLV
152
- Real::Media Real::Audio Real::Metafile Red RIFF AIFF ASF WTV DICOM FITS MIE
153
- JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion
154
- EXE::PEString EXE::MachO EXE::PEF EXE::ELF EXE::AR EXE::CHM LNK Font VCard
155
- Text VCard::VCalendar VCard::VNote RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR
156
- ZIP::RAR5 RTF OOXML iWork ISO FLIR::AFF FLIR::FPF MacOS MacOS::MDItem
157
- FlashPix::DocTable
148
+ FujiFilm::MRAW Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3
149
+ ID3::Lyrics3 FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC
150
+ MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile
151
+ QuickTime::Stream QuickTime::Tags360Fly Matroska Matroska::StdTag MOI MXF DV
152
+ Flash Flash::FLV Real::Media Real::Audio Real::Metafile Red RIFF AIFF ASF
153
+ WTV DICOM FITS XISF MIE JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH
154
+ Torrent EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF EXE::ELF
155
+ EXE::AR EXE::CHM LNK Font VCard Text VCard::VCalendar VCard::VNote RSRC
156
+ Rawzor ZIP ZIP::GZIP ZIP::RAR ZIP::RAR5 RTF OOXML iWork ISO FLIR::AFF
157
+ FLIR::FPF MacOS MacOS::MDItem FlashPix::DocTable
158
158
  );
159
159
 
160
160
  # alphabetical list of current Lang modules
@@ -193,10 +193,11 @@ $defaultLang = 'en'; # default language
193
193
  @fileTypes = qw(JPEG EXV CRW DR4 TIFF GIF MRW RAF X3F JP2 PNG MIE MIFF PS PDF
194
194
  PSD XMP BMP WPG BPG PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV
195
195
  OGG FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF
196
- LFP HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR
197
- 7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC
198
- M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA
199
- PDB PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO TXT);
196
+ LFP HTML VRD RTF FITS XISF XCF DSS QTIF FPX PICT ZIP GZIP PLIST
197
+ RAR 7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font
198
+ RSRC M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI
199
+ R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO
200
+ TXT);
200
201
 
201
202
  # file types that we can write (edit)
202
203
  my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
@@ -364,6 +365,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
364
365
  JPC => 'J2C',
365
366
  JPE => 'JPEG',
366
367
  JPEG => ['JPEG', 'Joint Photographic Experts Group'],
368
+ JPH => ['JP2', 'High-throughput JPEG 2000'],
367
369
  JPF => 'JP2',
368
370
  JPG => 'JPEG',
369
371
  JPM => ['JP2', 'JPEG 2000 compound image'],
@@ -545,6 +547,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
545
547
  X3F => ['X3F', 'Sigma RAW format'],
546
548
  XCF => ['XCF', 'GIMP native image format'],
547
549
  XHTML=> ['HTML', 'Extensible HyperText Markup Language'],
550
+ XISF => ['XISF', 'Extensible Image Serialization Format'],
548
551
  XLA => ['FPX', 'Microsoft Excel Add-in'],
549
552
  XLAM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Add-in Macro-enabled'],
550
553
  XLS => ['FPX', 'Microsoft Excel Spreadsheet'],
@@ -675,6 +678,7 @@ my %fileDescription = (
675
678
  JNG => 'image/jng',
676
679
  JP2 => 'image/jp2',
677
680
  JPEG => 'image/jpeg',
681
+ JPH => 'image/jph',
678
682
  JPM => 'image/jpm',
679
683
  JPS => 'image/x-jps',
680
684
  JPX => 'image/jpx',
@@ -798,6 +802,7 @@ my %fileDescription = (
798
802
  WTV => 'video/x-ms-wtv',
799
803
  X3F => 'image/x-sigma-x3f',
800
804
  XCF => 'image/x-xcf',
805
+ XISF => 'image/x-xisf',
801
806
  XLA => 'application/vnd.ms-excel',
802
807
  XLAM => 'application/vnd.ms-excel.addin.macroEnabled.12',
803
808
  XLS => 'application/vnd.ms-excel',
@@ -994,6 +999,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
994
999
  WTV => '\xb7\xd8\x00\x20\x37\x49\xda\x11\xa6\x4e\x00\x07\xe9\x5e\xad\x8d',
995
1000
  X3F => 'FOVb',
996
1001
  XCF => 'gimp xcf ',
1002
+ XISF => 'XISF0100',
997
1003
  XMP => '\0{0,3}(\xfe\xff|\xff\xfe|\xef\xbb\xbf)?\0{0,3}\s*<',
998
1004
  ZIP => 'PK\x03\x04',
999
1005
  );
@@ -1062,6 +1068,7 @@ my %xmpShorthandOpt = ( 0 => 'None', 1 => 'Shorthand', 2 => ['Shorthand','OneDes
1062
1068
  my @availableOptions = (
1063
1069
  [ 'Binary', undef, 'flag to extract binary values even if tag not specified' ],
1064
1070
  [ 'ByteOrder', undef, 'default byte order when creating EXIF information' ],
1071
+ [ 'ByteUnit', 'SI', 'units for byte conversions (SI or Binary)'],
1065
1072
  [ 'Charset', 'UTF8', 'character set for converting Unicode characters' ],
1066
1073
  [ 'CharsetEXIF', undef, 'internal EXIF "ASCII" string encoding' ],
1067
1074
  [ 'CharsetFileName', undef, 'external encoding for file names' ],
@@ -1303,8 +1310,9 @@ my %systemTagsNotes = (
1303
1310
  FileSize => {
1304
1311
  Groups => { 1 => 'System', 2 => 'Other' },
1305
1312
  Notes => q{
1306
- note that the print conversion for this tag uses historic prefixes: 1 kB =
1307
- 1024 bytes, etc.
1313
+ note that the print conversion for this tag uses SI prefixes by default: 1
1314
+ kB = 1000 bytes, etc. Set the API ByteUnit option to "Binary" to use binary
1315
+ prefixes instead: 1 KiB = 1024 bytes, etc.
1308
1316
  },
1309
1317
  PrintConv => \&ConvertFileSize,
1310
1318
  },
@@ -1581,6 +1589,7 @@ my %systemTagsNotes = (
1581
1589
  ImageHeight => { Notes => 'the height of the image in number of pixels' },
1582
1590
  XResolution => { Notes => 'the horizontal pixel resolution' },
1583
1591
  YResolution => { Notes => 'the vertical pixel resolution' },
1592
+ NumPlanes => { Notes => 'number of color planes' },
1584
1593
  MaxVal => { Notes => 'maximum pixel value in PPM or PGM image' },
1585
1594
  EXIF => {
1586
1595
  Notes => q{
@@ -1844,7 +1853,7 @@ my %systemTagsNotes = (
1844
1853
  Geotime => {
1845
1854
  Writable => 1,
1846
1855
  WriteOnly => 1,
1847
- AllowGroup => '(exif|gps|xmp|xmp-exif)',
1856
+ AllowGroup => '(exif|gps|xmp|xmp-exif|quicktime|keys|itemlist|userdata)',
1848
1857
  Notes => q{
1849
1858
  this write-only tag is used to define a date/time for interpolating a
1850
1859
  position in the GPS track specified by the Geotag tag. Writing this tag
@@ -2408,17 +2417,28 @@ sub Options($$;@)
2408
2417
  }
2409
2418
  $$options{$param} = $newVal;
2410
2419
  } elsif ($param eq 'ImageHashType') {
2411
- if (defined $newVal and $newVal =~ /^(MD5|SHA256|SHA512)$/i) {
2420
+ if (not defined $newVal) {
2421
+ warn("Can't set $param to undef\n");
2422
+ } elsif ($newVal =~ /^(MD5|SHA256|SHA512)$/i) {
2412
2423
  $$options{$param} = uc($newVal);
2413
2424
  } else {
2414
- warn("Invalid $param setting '${newVal}'\n"), return $oldVal;
2425
+ warn("Invalid $param setting '${newVal}'\n");
2415
2426
  }
2416
2427
  } elsif ($param eq 'StructFormat') {
2417
2428
  if (defined $newVal) {
2418
- $newVal =~ /^(JSON|JSONQ)$/i or warn("Invalid $param setting '${newVal}'\n"), return $oldVal;
2429
+ $newVal =~ /^(JSON|JSONQ)$/i or warn("Invalid $param setting '${newVal}'\n"), next;
2419
2430
  $newVal = uc($newVal);
2420
2431
  }
2421
2432
  $$options{$param} = $newVal;
2433
+ } elsif ($param eq 'ByteUnit') {
2434
+ if (defined $newVal) {
2435
+ # (allow "Metric" or "SI" for SI, and "IT" or "Binary" for Binary)
2436
+ my $goodVal = ($newVal =~ /^S|M/i ? 'SI' : ($newVal =~ /^I|B/i ? 'Binary' : undef));
2437
+ $goodVal or warn("Invalid $param setting '${newVal}'\n"), next;
2438
+ $$options{$param} = $goodVal;
2439
+ } else {
2440
+ warn("Can't set $param to undef\n");
2441
+ }
2422
2442
  } else {
2423
2443
  if ($param eq 'Escape') {
2424
2444
  # set ESCAPE_PROC
@@ -2543,7 +2563,7 @@ sub ExtractInfo($;@)
2543
2563
  $self->WarnOnce('Install Time::HiRes to generate ProcessingTime');
2544
2564
  }
2545
2565
  }
2546
-
2566
+
2547
2567
  # create Hash object if ImageDataHash is requested
2548
2568
  if ($$req{imagedatahash} and not $$self{ImageDataHash}) {
2549
2569
  my $imageHashType = $self->Options('ImageHashType');
@@ -3451,9 +3471,10 @@ sub GetValue($$;$)
3451
3471
  } elsif (wantarray) {
3452
3472
  # return array if requested
3453
3473
  return @$value;
3454
- } elsif ($type eq 'PrintConv' and not $$self{OPTIONS}{List} and not ref $$value[0]) {
3455
- # join PrintConv values in comma-separated string if List option not used
3474
+ } elsif ($type eq 'PrintConv' and not $$self{OPTIONS}{List}) {
3475
+ # join PrintConv values in delimited string if List option not used
3456
3476
  # and list contains simple scalars (otherwise return ARRAY ref)
3477
+ ref and return $value foreach @$value;
3457
3478
  $value = join $$self{OPTIONS}{ListSep}, @$value;
3458
3479
  }
3459
3480
  }
@@ -6018,7 +6039,7 @@ sub ConvertDateTime($$)
6018
6039
  ++$a[5];
6019
6040
  last; # (this was a goto)
6020
6041
  }
6021
- }
6042
+ }
6022
6043
  }
6023
6044
  $neg and $frac =~ s/^\.//;
6024
6045
  $fmt =~ s/(^|[^%])((%%)*)%-?\.?\d*f/$1$2$frac/g;
@@ -6198,16 +6219,26 @@ sub GetUnixTime($;$)
6198
6219
  # Print conversion for file size
6199
6220
  # Inputs: 0) file size in bytes
6200
6221
  # Returns: converted file size
6201
- sub ConvertFileSize($)
6202
- {
6203
- my $val = shift;
6204
- $val < 2000 and return "$val bytes";
6205
- $val < 10000 and return sprintf('%.1f kB', $val / 1000);
6206
- $val < 2000000 and return sprintf('%.0f kB', $val / 1000);
6207
- $val < 10000000 and return sprintf('%.1f MB', $val / 1000000);
6208
- $val < 2000000000 and return sprintf('%.0f MB', $val / 1000000);
6209
- $val < 10000000000 and return sprintf('%.1f GB', $val / 1000000000);
6210
- return sprintf('%.0f GB', $val / 1000000000);
6222
+ sub ConvertFileSize($;$)
6223
+ {
6224
+ my ($val, $et) = @_;
6225
+ if ($et and $$et{OPTIONS}{ByteUnit} eq 'Binary') {
6226
+ $val < 2048 and return "$val bytes";
6227
+ $val < 10240 and return sprintf('%.1f KiB', $val / 1024);
6228
+ $val < 2097152 and return sprintf('%.0f KiB', $val / 1024);
6229
+ $val < 10485760 and return sprintf('%.1f MiB', $val / 1048576);
6230
+ $val < 2147483648 and return sprintf('%.0f MiB', $val / 1048576);
6231
+ $val < 10737418240 and return sprintf('%.1f GiB', $val / 1073741824);
6232
+ return sprintf('%.0f GiB', $val / 1073741824);
6233
+ } else {
6234
+ $val < 2000 and return "$val bytes";
6235
+ $val < 10000 and return sprintf('%.1f kB', $val / 1000);
6236
+ $val < 2000000 and return sprintf('%.0f kB', $val / 1000);
6237
+ $val < 10000000 and return sprintf('%.1f MB', $val / 1000000);
6238
+ $val < 2000000000 and return sprintf('%.0f MB', $val / 1000000);
6239
+ $val < 10000000000 and return sprintf('%.1f GB', $val / 1000000000);
6240
+ return sprintf('%.0f GB', $val / 1000000000);
6241
+ }
6211
6242
  }
6212
6243
 
6213
6244
  #------------------------------------------------------------------------------
@@ -7475,7 +7506,8 @@ sub ProcessJPEG($$)
7475
7506
  my $hdr = $1;
7476
7507
  $dumpType = 'JUMBF';
7477
7508
  SetByteOrder('MM');
7478
- my $seq = Get32u($segDataPt, 4) - 1; # (start from 0)
7509
+ # (sequence should start from 1, but some software incorrectly writes 0)
7510
+ my $seq = Get32u($segDataPt, 4);
7479
7511
  my $len = Get32u($segDataPt, 8);
7480
7512
  my $type = substr($$segDataPt, 12, 4);
7481
7513
  my $hdrLen;
@@ -7485,14 +7517,13 @@ sub ProcessJPEG($$)
7485
7517
  } else {
7486
7518
  $hdrLen = 8;
7487
7519
  }
7488
- $jumbfChunk{$type} or $jumbfChunk{$type} = [ ];
7520
+ $jumbfChunk{$type} or $jumbfChunk{$type} = [ '' ];
7489
7521
  if ($len < $hdrLen) {
7490
7522
  $self->Warn('Invalid JUMBF segment');
7491
- } elsif ($seq < 0) {
7492
- $self->Warn('Invalid JUMBF sequence number');
7493
- } elsif (defined $jumbfChunk{$type}[$seq]) {
7523
+ } elsif (defined $jumbfChunk{$type}[$seq] and length $jumbfChunk{$type}[$seq]) {
7494
7524
  $self->Warn('Duplicate JUMBF sequence number');
7495
7525
  } else {
7526
+ $seq or $self->Warn('Incorrect JUMBF sequence numbering (should start from 0, not 1)');
7496
7527
  # add to list of JUMBF chunks
7497
7528
  $jumbfChunk{$type}[$seq] = substr($$segDataPt, 8 + $hdrLen);
7498
7529
  # check to see if we have a complete JUMBF box
@@ -7716,6 +7747,19 @@ sub ProcessTIFF($$;$)
7716
7747
  return $rtnVal;
7717
7748
  }
7718
7749
 
7750
+ #------------------------------------------------------------------------------
7751
+ # Process TIFF as a sub-document
7752
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
7753
+ # Returns: 1 if this looked like a valid EXIF block, 0 otherwise, or -1 on write error
7754
+ sub ProcessSubTIFF($$;$)
7755
+ {
7756
+ my ($self, $dirInfo, $tagTablePtr) = @_;
7757
+ $$self{DOC_NUM} = ++$$self{DOC_COUNT};
7758
+ my $rtnVal = $self->ProcessTIFF($dirInfo, $tagTablePtr);
7759
+ delete $$self{DOC_NUM};
7760
+ return $rtnVal;
7761
+ }
7762
+
7719
7763
  #------------------------------------------------------------------------------
7720
7764
  # Process TIFF data
7721
7765
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
@@ -7731,8 +7775,8 @@ sub DoProcessTIFF($$;$)
7731
7775
  my ($err, $sig, $canonSig, $otherSig);
7732
7776
 
7733
7777
  # attempt to read TIFF header
7734
- $$self{EXIF_DATA} = '';
7735
7778
  if ($raf) {
7779
+ $$self{EXIF_DATA} = '';
7736
7780
  if ($outfile) {
7737
7781
  $raf->Seek(0, 0) or return 0;
7738
7782
  if ($base) {
@@ -7940,6 +7984,9 @@ sub DoProcessTIFF($$;$)
7940
7984
  }
7941
7985
  if ($$self{TIFF_TYPE} eq 'TIFF') {
7942
7986
  $self->FoundTag(PageCount => $$self{PageCount}) if $$self{MultiPage};
7987
+ } elsif ($$self{TIFF_TYPE} eq 'NRW' and $$self{VALUE}{NEFLinearizationTable}) {
7988
+ # fix NEF type if misidentified as NRW
7989
+ $self->OverrideFileType($$self{TIFF_TYPE} = 'NEF');
7943
7990
  }
7944
7991
  if ($$self{ImageDataHash} and $$self{A100DataOffset} and $raf->Seek($$self{A100DataOffset},0)) {
7945
7992
  $self->ImageDataHash($raf, undef, 'A100');
@@ -8081,8 +8128,8 @@ sub DoProcessTIFF($$;$)
8081
8128
  # check DNG version
8082
8129
  if ($$self{DNGVersion}) {
8083
8130
  my $ver = $$self{DNGVersion};
8084
- # currently support up to DNG version 1.6
8085
- unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.6) {
8131
+ # currently support up to DNG version 1.7
8132
+ unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.7) {
8086
8133
  $ver =~ tr/ /./;
8087
8134
  $self->Error("DNG Version $ver not yet tested", 1);
8088
8135
  }
@@ -8351,7 +8398,7 @@ sub GetTagInfo($$$;$$$)
8351
8398
  }
8352
8399
  }
8353
8400
  # don't return Unknown tags unless that option is set (also see forum13716)
8354
- if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not
8401
+ if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not
8355
8402
  ($$self{OPTIONS}{Verbose} or $$self{HTML_DUMP} or
8356
8403
  ($$self{OPTIONS}{Validate} and not $$tagInfo{AddedUnknown})))
8357
8404
  {
@@ -102,11 +102,11 @@ supported by ExifTool (r = read, w = write, c = create):
102
102
  DCP r/w | ICO r | MPG r | PSB r/w | WV r
103
103
  DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
104
104
  DFONT r | IDML r | MQV r/w | PSP r | XCF r
105
- DIVX r | IIQ r/w | MRC r | QTIF r/w | XLS r
106
- DJVU r | IND r/w | MRW r/w | R3D r | XLSX r
107
- DLL r | INSP r/w | MXF r | RA r | XMP r/w/c
108
- DNG r/w | INSV r | NEF r/w | RAF r/w | ZIP r
109
- DOC r | INX r | NKSC r/w | RAM r |
105
+ DIVX r | IIQ r/w | MRC r | QTIF r/w | XISF r
106
+ DJVU r | IND r/w | MRW r/w | R3D r | XLS r
107
+ DLL r | INSP r/w | MXF r | RA r | XLSX r
108
+ DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
109
+ DOC r | INX r | NKSC r/w | RAM r | ZIP r
110
110
  DOCX r | ISO r | NRW r/w | RAR r |
111
111
 
112
112
  Meta Information
@@ -467,6 +467,12 @@ big-endian ('MM') order is assumed. This can also be set via the
467
467
  L<ExifByteOrder tag|Image::ExifTool::TagNames/Extra Tags>, but the ByteOrder
468
468
  option takes precedence if both are set.
469
469
 
470
+ =item ByteUnit
471
+
472
+ Units for print conversion of FileSize and other byte values. Either 'SI'
473
+ (eg. kB for 1000 bytes) or 'Binary' (eg. KiB for 1024 bytes). Default is
474
+ 'SI'.
475
+
470
476
  =item Charset
471
477
 
472
478
  Character set for encoding character tag values passed to/from ExifTool with
@@ -554,12 +560,12 @@ without recoding. Default is 0.
554
560
  Comma-delimited list of settings for writing compact XMP. Below is a list
555
561
  of available settings. Note that 'NoPadding' effects only embedded XMP
556
562
  since padding is never written for stand-alone XMP files. Also note that
557
- 'OneDesc' is not recommended when writing XMP larger than 64 kB to a JPG
563
+ 'OneDesc' is not recommended when writing XMP larger than 64 KiB to a JPG
558
564
  file because it interferes with ExifTool's technique of splitting off large
559
565
  rdf:Description elements into the extended XMP. Case is not significant for
560
566
  any of these options. Aliases are given in brackets. Default is undef.
561
567
 
562
- NoPadding - Avoid 2 kB of recommended padding at end of XMP (NoPad)
568
+ NoPadding - Avoid 2 KiB of recommended padding at end of XMP (NoPad)
563
569
  NoIndent - No spaces to indent lines (NoSpace, NoSpaces)
564
570
  NoNewline - Avoid unnecessary newlines (NoNewlines)
565
571
  Shorthand - Use XMP Shorthand format
@@ -2440,7 +2446,7 @@ ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1,
2440
2446
  IPTC, IPTC#, ISO, ITC, InfiRay, Insta360, InteropIFD, ItemList, JFIF, JFXX,
2441
2447
  JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys, Kodak,
2442
2448
  KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf,
2443
- LeafSubIFD, Leica, Lyrics3, Lytro, M2TS, MAC, MIE-Audio, MIE-Camera,
2449
+ LeafSubIFD, Leica, Lyrics3, Lytro, M-RAW, M2TS, MAC, MIE-Audio, MIE-Camera,
2444
2450
  MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo, MIE-Image,
2445
2451
  MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview,
2446
2452
  MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB, MNG, MOBI, MOI,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exiftool-vendored.exe",
3
- "version": "12.67.0",
3
+ "version": "12.70.0",
4
4
  "description": "Vendored win32 ExifTool for Node.js",
5
5
  "main": "./index.js",
6
6
  "homepage": "https://github.com/mceachen/exiftool-vendored.exe#readme",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "devDependencies": {
44
44
  "mocha": "^10.2.0",
45
- "prettier": "^3.0.3",
46
- "release-it": "^16.2.1"
45
+ "prettier": "^3.1.0",
46
+ "release-it": "^17.0.0"
47
47
  }
48
48
  }