exiftool_vendored 13.37.0 → 13.40.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +41 -3
  3. data/bin/MANIFEST +7 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +49 -47
  7. data/bin/config_files/local_time.config +55 -0
  8. data/bin/exiftool +83 -70
  9. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  10. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +2 -2
  11. data/bin/lib/Image/ExifTool/DJI.pm +256 -20
  12. data/bin/lib/Image/ExifTool/DSF.pm +138 -0
  13. data/bin/lib/Image/ExifTool/EXE.pm +3 -1
  14. data/bin/lib/Image/ExifTool/Font.pm +386 -118
  15. data/bin/lib/Image/ExifTool/Geolocation.pm +10 -7
  16. data/bin/lib/Image/ExifTool/Geotag.pm +21 -2
  17. data/bin/lib/Image/ExifTool/GoPro.pm +6 -3
  18. data/bin/lib/Image/ExifTool/Google.pm +16 -6
  19. data/bin/lib/Image/ExifTool/ID3.pm +11 -10
  20. data/bin/lib/Image/ExifTool/LNK.pm +63 -2
  21. data/bin/lib/Image/ExifTool/M2TS.pm +32 -23
  22. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  23. data/bin/lib/Image/ExifTool/OOXML.pm +3 -2
  24. data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
  25. data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
  26. data/bin/lib/Image/ExifTool/QuickTime.pm +3 -3
  27. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +44 -35
  28. data/bin/lib/Image/ExifTool/Sony.pm +19 -14
  29. data/bin/lib/Image/ExifTool/TagLookup.pm +35 -1
  30. data/bin/lib/Image/ExifTool/TagNames.pod +1383 -1217
  31. data/bin/lib/Image/ExifTool/WavPack.pm +144 -0
  32. data/bin/lib/Image/ExifTool/XMP.pm +12 -7
  33. data/bin/lib/Image/ExifTool/XMP2.pl +11 -5
  34. data/bin/lib/Image/ExifTool.pm +46 -26
  35. data/bin/lib/Image/ExifTool.pod +64 -56
  36. data/bin/perl-Image-ExifTool.spec +47 -46
  37. data/lib/exiftool_vendored/version.rb +1 -1
  38. metadata +4 -1
@@ -0,0 +1,144 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: WavPack.pm
3
+ #
4
+ # Description: Read metadata from WavPack audio files
5
+ #
6
+ # Revisions: 2025-09-24 - P. Harvey Created
7
+ #
8
+ # References: 1) https://www.wavpack.com/WavPack5FileFormat.pdf
9
+ #------------------------------------------------------------------------------
10
+
11
+ package Image::ExifTool::WavPack;
12
+
13
+ use strict;
14
+ use vars qw($VERSION);
15
+ use Image::ExifTool qw(:DataAccess :Utils);
16
+ use Image::ExifTool::RIFF;
17
+ use Image::ExifTool::APE;
18
+
19
+ $VERSION = '1.00';
20
+
21
+ %Image::ExifTool::WavPack::Main = (
22
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
23
+ GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Audio' },
24
+ FORMAT => 'int32u',
25
+ NOTES => q{
26
+ Tags extracted from the header of WavPack (WV and WVP) audio files. These
27
+ files may also contain RIFF, ID3 and/or APE metadata which is also extracted
28
+ by ExifTool. See L<https://www.wavpack.com/WavPack5FileFormat.pdf> for the
29
+ WavPack specification.
30
+ },
31
+ 6.1 => {
32
+ Name => 'BytesPerSample',
33
+ Mask => 0x03,
34
+ ValueConv => '$val + 1',
35
+ },
36
+ 6.2 => {
37
+ Name => 'AudioType',
38
+ Mask => 0x04,
39
+ PrintConv => { 0 => 'Stereo', 1 => 'Mono' },
40
+ },
41
+ 6.3 => {
42
+ Name => 'Compression',
43
+ Mask => 0x08,
44
+ PrintConv => { 0 => 'Lossless', 1 => 'Hybrid' },
45
+ },
46
+ 6.4 => {
47
+ Name => 'DataFormat',
48
+ Mask => 0x80,
49
+ PrintConv => { 0 => 'Integer', 1 => 'Floating Point' },
50
+ },
51
+ 6.5 => {
52
+ Name => 'SampleRate',
53
+ Mask => 0x07800000,
54
+ Priority => 0, # ("Custom" is not very useful)
55
+ PrintConv => { # (NC)
56
+ 0 => 6000,
57
+ 1 => 8000,
58
+ 2 => 9600,
59
+ 3 => 11025,
60
+ 4 => 12000,
61
+ 5 => 16000,
62
+ 6 => 22050,
63
+ 7 => 24000,
64
+ 8 => 32000,
65
+ 9 => 44100,
66
+ 10 => 48000,
67
+ 11 => 64000,
68
+ 12 => 88200,
69
+ 13 => 96000,
70
+ 14 => 192000,
71
+ 15 => 'Custom',
72
+ },
73
+ },
74
+ );
75
+
76
+ #------------------------------------------------------------------------------
77
+ # Extract metadata from a WavPack file
78
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference
79
+ # Returns: 1 on success, 0 if this wasn't a valid WavPack file
80
+ sub ProcessWV($$)
81
+ {
82
+ my ($et, $dirInfo) = @_;
83
+ my $raf = $$dirInfo{RAF};
84
+ my $buff;
85
+
86
+ # verify this is a valid WavPack file
87
+ return 0 unless $raf->Read($buff, 32) == 32;
88
+ return 0 unless $buff =~ /^wvpk.{4}[\x02\x10]\x04/s;
89
+ $et->SetFileType();
90
+ my %dirInfo = (
91
+ DataPt => \$buff,
92
+ DirStart => 0,
93
+ DirLen => length($buff),
94
+ );
95
+ $et->ProcessBinaryData(\%dirInfo, GetTagTable('Image::ExifTool::WavPack::Main'));
96
+ # historically, the RIFF module has handled RIFF-type WavPack files
97
+ $raf->Seek(0,0);
98
+ push @{$$et{PATH}}, 'RIFF'; # update metadata path
99
+ Image::ExifTool::RIFF::ProcessRIFF($et, $dirInfo);
100
+ # also look for ID3 and APE trailers (ProcessAPE also checks for ID3)
101
+ $$et{PATH}[-1] = 'APE';
102
+ Image::ExifTool::APE::ProcessAPE($et, $dirInfo);
103
+ pop @{$$et{PATH}};
104
+ return 1;
105
+ }
106
+
107
+ 1; # end
108
+
109
+ __END__
110
+
111
+ =head1 NAME
112
+
113
+ Image::ExifTool::WavPack - Read metadata from WavPack audio files
114
+
115
+ =head1 SYNOPSIS
116
+
117
+ This module is used by Image::ExifTool
118
+
119
+ =head1 DESCRIPTION
120
+
121
+ This module contains definitions required by Image::ExifTool to read metadata
122
+ from WavPack audio files.
123
+
124
+ =head1 AUTHOR
125
+
126
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
127
+
128
+ This library is free software; you can redistribute it and/or modify it
129
+ under the same terms as Perl itself.
130
+
131
+ =head1 REFERENCES
132
+
133
+ =over 4
134
+
135
+ =item L<https://www.wavpack.com/WavPack5FileFormat.pdf>
136
+
137
+ =back
138
+
139
+ =head1 SEE ALSO
140
+
141
+ L<Image::ExifTool::TagNames/WavPack Tags>,
142
+ L<Image::ExifTool(3pm)|Image::ExifTool>
143
+
144
+ =cut
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.74';
53
+ $VERSION = '3.75';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -4436,7 +4436,7 @@ sub ProcessXMP($$;$)
4436
4436
  $buf2 = pack('C*', unpack("$fmt*",$buff));
4437
4437
  }
4438
4438
  if (Image::ExifTool::GetWarning()) {
4439
- $et->Warn('Superfluous BOM at start of XMP');
4439
+ $et->Warn('Superfluous BOM at start of XMP') unless $$dirInfo{RAF};
4440
4440
  $dataPt = \$buff; # use XMP with the BOM removed
4441
4441
  } else {
4442
4442
  $et->Warn('XMP is double UTF-encoded');
@@ -4487,13 +4487,16 @@ sub ProcessXMP($$;$)
4487
4487
  $begin = join "\0", split //, $begin;
4488
4488
  # must reset pos because it was killed by previous unsuccessful //g match
4489
4489
  pos($$dataPt) = $dirStart;
4490
+ my $badEnc;
4490
4491
  if ($$dataPt =~ /\G(\0)?\Q$begin\E\0./sg) {
4491
4492
  # validate byte ordering by checking for U+FEFF character
4492
4493
  if ($1) {
4493
4494
  # should be big-endian since we had a leading \0
4494
- $fmt = 'n' if $$dataPt =~ /\G\xfe\xff/g;
4495
+ $fmt = 'n';
4496
+ $badEnc = 1 unless $$dataPt =~ /\G\xfe\xff/g;
4495
4497
  } else {
4496
- $fmt = 'v' if $$dataPt =~ /\G\0\xff\xfe/g;
4498
+ $fmt = 'v';
4499
+ $badEnc = 1 unless $$dataPt =~ /\G\0\xff\xfe/g;
4497
4500
  }
4498
4501
  } else {
4499
4502
  # check for UTF-32 encoding (with three \0's between characters)
@@ -4503,12 +4506,14 @@ sub ProcessXMP($$;$)
4503
4506
  $fmt = 0; # set format to zero as indication we didn't find encoded XMP
4504
4507
  } elsif ($1) {
4505
4508
  # should be big-endian
4506
- $fmt = 'N' if $$dataPt =~ /\G\0\0\xfe\xff/g;
4509
+ $fmt = 'N';
4510
+ $badEnc = 1 unless $$dataPt =~ /\G\0\0\xfe\xff/g;
4507
4511
  } else {
4508
- $fmt = 'V' if $$dataPt =~ /\G\0\0\0\xff\xfe\0\0/g;
4512
+ $fmt = 'V';
4513
+ $badEnc = 1 unless $$dataPt =~ /\G\0\0\0\xff\xfe\0\0/g;
4509
4514
  }
4510
4515
  }
4511
- defined $fmt or $et->Warn('XMP character encoding error');
4516
+ $badEnc and $et->Warn('Invalid XMP encoding marker');
4512
4517
  }
4513
4518
  # warn if standard XMP is missing xpacket wrapper
4514
4519
  if ($$et{XMP_NO_XPACKET} and $$et{OPTIONS}{Validate} and
@@ -499,11 +499,12 @@ my %sImageRegion = ( # new in 1.5
499
499
  NAMESPACE => 'Iptc4xmpExt',
500
500
  TABLE_DESC => 'XMP IPTC Extension',
501
501
  NOTES => q{
502
- This table contains tags defined by the IPTC Extension schema version 1.7
503
- and IPTC Video Metadata version 1.3. The actual namespace prefix is
504
- "Iptc4xmpExt", but ExifTool shortens this for the family 1 group name. (See
505
- L<http://www.iptc.org/standards/photo-metadata/iptc-standard/> and
506
- L<https://iptc.org/standards/video-metadata-hub/>.)
502
+ This table contains tags defined by the IPTC Extension schema version 1.7
503
+ and IPTC Video Metadata version 1.3, plus the AI additions. The actual
504
+ namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for the family
505
+ 1 group name. (See
506
+ L<http://www.iptc.org/standards/photo-metadata/iptc-standard/> and
507
+ L<https://iptc.org/standards/video-metadata-hub/>.)
507
508
  },
508
509
  AboutCvTerm => {
509
510
  Struct => \%sCVTermDetails,
@@ -769,6 +770,11 @@ my %sImageRegion = ( # new in 1.5
769
770
  ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
770
771
  # new Extension 1.6 property
771
772
  EventId => { Name => 'EventID', List => 'Bag' },
773
+ # new AI tags
774
+ AISystemUsed => { },
775
+ AISystemVersionUsed => { },
776
+ AIPromptInformation => { },
777
+ AIPromptWriterName => { },
772
778
  );
773
779
 
774
780
  #------------------------------------------------------------------------------
@@ -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 $advFmtSelf $configFile @configFiles $noConfig);
31
31
 
32
- $VERSION = '13.37';
32
+ $VERSION = '13.40';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -148,16 +148,16 @@ sub ReadValue($$$;$$$);
148
148
  PCX PGF PSP PhotoCD Radiance Other::PFM PDF PostScript Photoshop::Header
149
149
  Photoshop::Layers Photoshop::ImageData FujiFilm::RAFHeader FujiFilm::RAF
150
150
  FujiFilm::IFD FujiFilm::MRAW Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD
151
- Sony::PMP ITC ID3 ID3::Lyrics3 FLAC AAC Ogg Vorbis APE APE::NewHeader
152
- APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime
153
- QuickTime::ImageFile QuickTime::Stream QuickTime::Tags360Fly Matroska
154
- Matroska::StdTag MOI MXF DV Flash Flash::FLV Real::Media Real::Audio
155
- Real::Metafile Red RIFF AIFF ASF TNEF WTV DICOM FITS XISF MIE JSON HTML
156
- XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString
157
- EXE::DebugRSDS EXE::DebugNB10 EXE::Misc EXE::MachO EXE::PEF EXE::ELF EXE::AR
158
- EXE::CHM LNK PCAP Font VCard Text VCard::VCalendar VCard::VNote RSRC Rawzor
159
- ZIP ZIP::GZIP ZIP::RAR ZIP::RAR5 RTF OOXML iWork ISO FLIR::AFF FLIR::FPF
160
- MacOS MacOS::MDItem FlashPix::DocTable
151
+ Sony::PMP ITC ID3 ID3::Lyrics3 FLAC AAC Ogg Vorbis DSF WavPack APE
152
+ APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing
153
+ M2TS QuickTime QuickTime::ImageFile QuickTime::Stream QuickTime::Tags360Fly
154
+ Matroska Matroska::StdTag MOI MXF DV Flash Flash::FLV Real::Media
155
+ Real::Audio Real::Metafile Red RIFF AIFF ASF TNEF WTV DICOM FITS XISF MIE
156
+ JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion
157
+ EXE::PEString EXE::DebugRSDS EXE::DebugNB10 EXE::Misc EXE::MachO EXE::PEF
158
+ EXE::ELF EXE::AR EXE::CHM LNK LNK::INI PCAP Font VCard Text VCard::VCalendar
159
+ VCard::VNote RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR ZIP::RAR5 RTF OOXML iWork
160
+ ISO FLIR::AFF FLIR::FPF MacOS MacOS::MDItem FlashPix::DocTable
161
161
  );
162
162
 
163
163
  # alphabetical list of current Lang modules
@@ -194,13 +194,13 @@ $defaultLang = 'en'; # default language
194
194
  # 3) PLIST must be in this list for the binary PLIST format, although it may
195
195
  # cause a file to be checked twice for XML
196
196
  @fileTypes = qw(JPEG EXV CRW DR4 TIFF GIF MRW RAF X3F JP2 PNG MIE MIFF PS PDF
197
- PSD XMP BMP WPG BPG PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV
198
- OGG FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF
199
- LFP HTML VRD RTF FITS XISF XCF DSS QTIF FPX PICT ZIP GZIP PLIST
200
- RAR 7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font
201
- JUMBF RSRC M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard
202
- LRI R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS PCAP JSON MP3
203
- TNEF DICOM PCD NKA ICO TXT AAC);
197
+ PSD XMP BMP WPG BPG PPM WV RIFF AIFF ASF MOV MPEG Real SWF PSP
198
+ FLV OGG FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF
199
+ FPF LFP HTML VRD RTF FITS XISF XCF DSF DSS QTIF FPX PICT ZIP
200
+ GZIP PLIST RAR 7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX
201
+ DPX RAW Font JUMBF RSRC M2TS MacOS PHP PCX DCX DWF DWG DXF WTV
202
+ Torrent VCard LRI R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS PCAP
203
+ JSON MP3 TNEF DICOM PCD NKA ICO TXT AAC);
204
204
 
205
205
  # file types that we can write (edit)
206
206
  my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
@@ -304,6 +304,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
304
304
  DPX => ['DPX', 'Digital Picture Exchange' ],
305
305
  DR4 => ['DR4', 'Canon VRD version 4 Recipe'],
306
306
  DS2 => ['DSS', 'Digital Speech Standard 2'],
307
+ DSF => ['DSF', 'DSF Stream File'],
307
308
  DSS => ['DSS', 'Digital Speech Standard'],
308
309
  DV => ['DV', 'Digital Video'],
309
310
  DVB => ['MOV', 'Digital Video Broadcasting'],
@@ -543,6 +544,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
543
544
  TTF => ['Font', 'True Type Font'],
544
545
  TUB => 'PSP',
545
546
  TXT => ['TXT', 'Text file'],
547
+ URL => ['LNK', 'Windows shortcut URL'],
546
548
  VCARD=> ['VCard','Virtual Card'],
547
549
  VCF => 'VCARD',
548
550
  VOB => ['MPEG', 'Video Object'],
@@ -556,7 +558,8 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
556
558
  WMA => ['ASF', 'Windows Media Audio'],
557
559
  WMF => ['WMF', 'Windows Metafile Format'],
558
560
  WMV => ['ASF', 'Windows Media Video'],
559
- WV => ['RIFF', 'WavePack lossless audio'],
561
+ WV => ['WV', 'WavPack Audio'],
562
+ WVP => 'WV',
560
563
  X3F => ['X3F', 'Sigma RAW format'],
561
564
  XCF => ['XCF', 'GIMP native image format'],
562
565
  XHTML=> ['HTML', 'Extensible HyperText Markup Language'],
@@ -571,6 +574,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
571
574
  XLTM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template Macro-enabled'],
572
575
  XLTX => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template'],
573
576
  XMP => ['XMP', 'Extensible Metadata Platform'],
577
+ VSDX => ['ZIP', 'Visio Diagram Document'],
574
578
  WOFF => ['Font', 'Web Open Font Format'],
575
579
  WOFF2=> ['Font', 'Web Open Font Format 2'],
576
580
  WPG => ['WPG', 'WordPerfect Graphics'],
@@ -652,6 +656,7 @@ my %fileDescription = (
652
656
  DPX => 'image/x-dpx',
653
657
  DR4 => 'application/octet-stream', #PH (NC)
654
658
  DS2 => 'audio/x-ds2',
659
+ DSF => 'audio/x-dsf',
655
660
  DSS => 'audio/x-dss',
656
661
  DV => 'video/x-dv',
657
662
  'DVR-MS' => 'video/x-ms-dvr',
@@ -811,6 +816,7 @@ my %fileDescription = (
811
816
  VCard=> 'text/vcard',
812
817
  VRD => 'application/octet-stream', #PH (NC)
813
818
  VSD => 'application/x-visio',
819
+ VSDX => 'application/vnd.ms-visio.drawing',
814
820
  WDP => 'image/vnd.ms-photo',
815
821
  WEBM => 'video/webm',
816
822
  WMA => 'audio/x-ms-wma',
@@ -818,6 +824,7 @@ my %fileDescription = (
818
824
  WMV => 'video/x-ms-wmv',
819
825
  WPG => 'image/x-wpg',
820
826
  WTV => 'video/x-ms-wtv',
827
+ WV => 'audio/x-wavpack',
821
828
  X3F => 'image/x-sigma-x3f',
822
829
  XCF => 'image/x-xcf',
823
830
  XISF => 'image/x-xisf',
@@ -901,6 +908,7 @@ my %moduleName = (
901
908
  TXT => 'Text',
902
909
  VRD => 'CanonVRD',
903
910
  WMF => 0,
911
+ WV => 'WavPack',
904
912
  X3F => 'SigmaRaw',
905
913
  XCF => 'GIMP',
906
914
  );
@@ -933,6 +941,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
933
941
  DOCX => 'PK\x03\x04',
934
942
  DPX => '(SDPX|XPDS)',
935
943
  DR4 => 'IIII[\x04|\x05]\0\x04\0',
944
+ DSF => 'DSD \x1c\0{7}.{16}fmt ',
936
945
  DSS => '(\x02dss|\x03ds2)',
937
946
  DV => '\x1f\x07\0[\x3f\xbf]', # (not tested if extension recognized)
938
947
  DWF => '\(DWF V\d',
@@ -968,9 +977,9 @@ $testLen = 1024; # number of bytes to read when testing for magic number
968
977
  JXL => '(\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl )',
969
978
  LFP => '\x89LFP\x0d\x0a\x1a\x0a',
970
979
  LIF => '\x70\0{3}.{4}\x2a.{4}<\0',
971
- LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
980
+ LNK => '(.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46|\[[InternetShortcut\][\x0d\x0a])',
972
981
  LRI => 'LELR \0',
973
- M2TS => '(....)?\x47',
982
+ M2TS => '.{0,191}?\x47(.{187}|.{191})\x47(.{187}|.{191})\x47',
974
983
  MacOS=> '\0\x05\x16\x07\0.\0\0Mac OS X ',
975
984
  MIE => '~[\x10\x18]\x04.0MIE',
976
985
  MIFF => 'id=ImageMagick',
@@ -1132,6 +1141,7 @@ my @availableOptions = (
1132
1141
  [ 'GeoMaxHDOP', undef, 'geotag maximum HDOP' ],
1133
1142
  [ 'GeoMaxPDOP', undef, 'geotag maximum PDOP' ],
1134
1143
  [ 'GeoMinSats', undef, 'geotag minimum satellites' ],
1144
+ [ 'GeoHPosErr', undef, 'geotag GPSHPositioningError based on $GPSDOP' ],
1135
1145
  [ 'GeoSpeedRef', undef, 'geotag GPSSpeedRef' ],
1136
1146
  [ 'GlobalTimeShift', undef, 'apply time shift to all extracted date/time values' ],
1137
1147
  [ 'GPSQuadrant', undef, 'quadrant for GPS if not otherwise known' ],
@@ -2292,7 +2302,8 @@ sub CleanWarning(;$)
2292
2302
  return undef unless defined $evalWarning;
2293
2303
  $str = $evalWarning;
2294
2304
  }
2295
- $str = $1 if $str =~ /(.*) at /s;
2305
+ # truncate at first " at " for warnings like "syntax error at (eval 80) line 1, at EOF"
2306
+ $str = $1 if $str =~ /(.*?) at /s;
2296
2307
  $str =~ s/\s+$//s;
2297
2308
  return $str;
2298
2309
  }
@@ -5523,23 +5534,31 @@ sub AddCleanup($)
5523
5534
  #------------------------------------------------------------------------------
5524
5535
  # Add warning tag
5525
5536
  # Inputs: 0) ExifTool object reference, 1) warning message
5526
- # 2) true if minor (2 if behaviour changes when warning is ignored,
5527
- # or 3 if warning shouldn't be issued when Validate option is used)
5537
+ # 2) 0=normal warning, 1=minor, 2=minor with behavioural change when
5538
+ # ignored, 3=warning shouldn't be issued with Validate option,
5539
+ # bit 0x04 set causes warning count to not be incremented
5528
5540
  # Returns: true if warning tag was added
5529
5541
  sub Warn($$;$)
5530
5542
  {
5531
5543
  my ($self, $str, $ignorable) = @_;
5532
5544
  my $noWarn = $$self{OPTIONS}{NoWarning};
5533
- if ($ignorable) {
5545
+ my $noCount;
5546
+ while ($ignorable) {
5547
+ if ($ignorable & 0x04) {
5548
+ $noCount = 1;
5549
+ $ignorable &= 0x03 or last;
5550
+ }
5551
+ my $ignorable = $ignorable & 0x03;
5534
5552
  return 0 if $$self{OPTIONS}{IgnoreMinorErrors};
5535
5553
  return 0 if $ignorable eq '3' and $$self{OPTIONS}{Validate};
5536
5554
  return 1 if defined $noWarn and eval { $str =~ /$noWarn/ };
5537
5555
  $str = $ignorable eq '2' ? "[Minor] $str" : "[minor] $str";
5556
+ last;
5538
5557
  }
5539
5558
  unless (defined $noWarn and eval { $str =~ /$noWarn/ }) {
5540
5559
  # add each warning only once but count number of occurrences
5541
5560
  if ($$self{WAS_WARNED}{$str}) {
5542
- ++$$self{WAS_WARNED}{$str};
5561
+ ++$$self{WAS_WARNED}{$str} unless $noCount;
5543
5562
  } else {
5544
5563
  $self->FoundTag('Warning', $str);
5545
5564
  $$self{WAS_WARNED}{$str} = 1;
@@ -9575,6 +9594,7 @@ sub DoEscape($$)
9575
9594
  sub SetFileType($;$$$)
9576
9595
  {
9577
9596
  my ($self, $fileType, $mimeType, $normExt) = @_;
9597
+ # use only the first FileType set if called again for the main document
9578
9598
  unless ($$self{FileType} and not $$self{DOC_NUM}) {
9579
9599
  my $baseType = $$self{FILE_TYPE};
9580
9600
  my $ext = $$self{FILE_EXT};
@@ -54,62 +54,63 @@ Image::ExifTool - Read and write meta information
54
54
  =head1 DESCRIPTION
55
55
 
56
56
  Reads and writes meta information in a wide variety of files, including the
57
- maker notes of many digital cameras by various manufacturers such as Canon,
58
- Casio, DJI, FLIR, FujiFilm, GE, GoPro, HP, JVC/Victor, Kodak, Leaf,
59
- Minolta/Konica-Minolta, Nikon, Nintendo, Olympus/Epson, Panasonic/Leica,
60
- Pentax/Asahi, Phase One, Reconyx, Ricoh, Samsung, Sanyo, Sigma/Foveon and
61
- Sony.
57
+ maker notes of many digital cameras by various manufacturers such as Apple,
58
+ Canon, Casio, DJI, FLIR, FujiFilm, GE, Google, GoPro, HP, JVC/Victor, Kodak,
59
+ Leaf, Minolta/Konica-Minolta, Nikon, Nintendo, Olympus/Epson,
60
+ Panasonic/Leica, Pentax/Asahi, Phase One, Reconyx, Ricoh, Samsung, Sanyo,
61
+ Sigma/Foveon and Sony.
62
62
 
63
63
  Below is a list of file types and meta information formats currently
64
64
  supported by ExifTool (r = read, w = write, c = create):
65
65
 
66
66
  File Types
67
67
  ------------+-------------+-------------+-------------+------------
68
- 360 r/w | DPX r | JNG r/w | ODP r | RSRC r
69
- 3FR r | DR4 r/w/c | JP2 r/w | ODS r | RTF r
70
- 3G2 r/w | DSS r | JPEG r/w | ODT r | RW2 r/w
71
- 3GP r/w | DV r | JSON r | OFR r | RWL r/w
72
- 7Z r | DVB r/w | JXL r/w | OGG r | RWZ r
73
- A r | DVR-MS r | K25 r | OGV r | RM r
74
- AA r | DYLIB r | KDC r | ONP r | SEQ r
75
- AAC r | EIP r | KEY r | OPUS r | SKETCH r
76
- AAE r | EPS r/w | LA r | ORF r/w | SO r
77
- AAX r/w | EPUB r | LFP r | ORI r/w | SR2 r/w
78
- ACR r | ERF r/w | LIF r | OTF r | SRF r
79
- AFM r | EXE r | LNK r | PAC r | SRW r/w
80
- AI r/w | EXIF r/w/c | LRV r/w | PAGES r | SVG r
81
- AIFF r | EXR r | M2TS r | PBM r/w | SWF r
82
- APE r | EXV r/w/c | M4A/V r/w | PCAP r | THM r/w
83
- ARQ r/w | F4A/V r/w | MACOS r | PCAPNG r | TIFF r/w
84
- ARW r/w | FFF r/w | MAX r | PCD r | TNEF r
85
- ASF r | FITS r | MEF r/w | PCX r | TORRENT r
86
- AVI r | FLA r | MIE r/w/c | PDB r | TTC r
87
- AVIF r/w | FLAC r | MIFF r | PDF r/w | TTF r
88
- AZW r | FLIF r/w | MKA r | PEF r/w | TXT r
89
- BMP r | FLV r | MKS r | PFA r | VCF r
90
- BPG r | FPF r | MKV r | PFB r | VNT r
91
- BTF r | FPX r | MNG r/w | PFM r | VRD r/w/c
92
- C2PA r | GIF r/w | MOBI r | PGF r | VSD r
93
- CHM r | GLV r/w | MODD r | PGM r/w | WAV r
94
- COS r | GPR r/w | MOI r | PLIST r | WDP r/w
95
- CR2 r/w | GZ r | MOS r/w | PICT r | WEBP r/w
96
- CR3 r/w | HDP r/w | MOV r/w | PMP r | WEBM r
97
- CRM r/w | HDR r | MP3 r | PNG r/w | WMA r
98
- CRW r/w | HEIC r/w | MP4 r/w | PPM r/w | WMV r
99
- CS1 r/w | HEIF r/w | MPC r | PPT r | WPG r
100
- CSV r | HTML r | MPG r | PPTX r | WTV r
101
- CUR r | ICC r/w/c | MPO r/w | PS r/w | WV r
102
- CZI r | ICO r | MQV r/w | PSB r/w | X3F r/w
103
- DCM r | ICS r | MRC r | PSD r/w | XCF r
104
- DCP r/w | IDML r | MRW r/w | PSP r | XISF r
105
- DCR r | IIQ r/w | MXF r | QTIF r/w | XLS r
106
- DFONT r | IND r/w | NEF r/w | R3D r | XLSX r
107
- DIVX r | INSP r/w | NKA r | RA r | XMP r/w/c
108
- DJVU r | INSV r | NKSC r/w | RAF r/w | ZIP r
109
- DLL r | INX r | NRW r/w | RAM r |
110
- DNG r/w | ISO r | NUMBERS r | RAR r |
111
- DOC r | ITC r | NXD r | RAW r/w |
112
- DOCX r | J2C r | O r | RIFF r |
68
+ 360 r/w | DR4 r/w/c | JP2 r/w | ODT r | RWL r/w
69
+ 3FR r | DSF r | JPEG r/w | OFR r | RWZ r
70
+ 3G2 r/w | DSS r | JSON r | OGG r | RM r
71
+ 3GP r/w | DV r | JXL r/w | OGV r | SEQ r
72
+ 7Z r | DVB r/w | K25 r | ONP r | SKETCH r
73
+ A r | DVR-MS r | KDC r | OPUS r | SO r
74
+ AA r | DYLIB r | KEY r | ORF r/w | SR2 r/w
75
+ AAC r | EIP r | LA r | ORI r/w | SRF r
76
+ AAE r | EPS r/w | LFP r | OTF r | SRW r/w
77
+ AAX r/w | EPUB r | LIF r | PAC r | SVG r
78
+ ACR r | ERF r/w | LNK r | PAGES r | SWF r
79
+ AFM r | EXE r | LRV r/w | PBM r/w | THM r/w
80
+ AI r/w | EXIF r/w/c | M2TS r | PCAP r | TIFF r/w
81
+ AIFF r | EXR r | M4A/V r/w | PCAPNG r | TNEF r
82
+ APE r | EXV r/w/c | MACOS r | PCD r | TORRENT r
83
+ ARQ r/w | F4A/V r/w | MAX r | PCX r | TTC r
84
+ ARW r/w | FFF r/w | MEF r/w | PDB r | TTF r
85
+ ASF r | FITS r | MIE r/w/c | PDF r/w | TXT r
86
+ AVI r | FLA r | MIFF r | PEF r/w | URL r
87
+ AVIF r/w | FLAC r | MKA r | PFA r | VCF r
88
+ AZW r | FLIF r/w | MKS r | PFB r | VNT r
89
+ BMP r | FLV r | MKV r | PFM r | VRD r/w/c
90
+ BPG r | FPF r | MNG r/w | PGF r | VSD r
91
+ BTF r | FPX r | MOBI r | PGM r/w | VSDX r
92
+ C2PA r | GIF r/w | MODD r | PLIST r | WAV r
93
+ CHM r | GLV r/w | MOI r | PICT r | WDP r/w
94
+ COS r | GPR r/w | MOS r/w | PMP r | WEBP r/w
95
+ CR2 r/w | GZ r | MOV r/w | PNG r/w | WEBM r
96
+ CR3 r/w | HDP r/w | MP3 r | PPM r/w | WMA r
97
+ CRM r/w | HDR r | MP4 r/w | PPT r | WMV r
98
+ CRW r/w | HEIC r/w | MPC r | PPTX r | WOFF r
99
+ CS1 r/w | HEIF r/w | MPG r | PS r/w | WOFF2 r
100
+ CSV r | HTML r | MPO r/w | PSB r/w | WPG r
101
+ CUR r | ICC r/w/c | MQV r/w | PSD r/w | WTV r
102
+ CZI r | ICO r | MRC r | PSP r | WV r
103
+ DCM r | ICS r | MRW r/w | QTIF r/w | X3F r/w
104
+ DCP r/w | IDML r | MXF r | R3D r | XCF r
105
+ DCR r | IIQ r/w | NEF r/w | RA r | XISF r
106
+ DFONT r | IND r/w | NKA r | RAF r/w | XLS r
107
+ DIVX r | INSP r/w | NKSC r/w | RAM r | XLSX r
108
+ DJVU r | INSV r | NRW r/w | RAR r | XMP r/w/c
109
+ DLL r | INX r | NUMBERS r | RAW r/w | ZIP r
110
+ DNG r/w | ISO r | NXD r | RIFF r |
111
+ DOC r | ITC r | O r | RSRC r |
112
+ DOCX r | J2C r | ODP r | RTF r |
113
+ DPX r | JNG r/w | ODS r | RW2 r/w |
113
114
 
114
115
  Meta Information
115
116
  ----------------------+----------------------+---------------------
@@ -795,6 +796,12 @@ ignored if the HDOP is greater than this. Default is undef.
795
796
  Maximum Position (3D) Dilution Of Precision for geotagging. GPS fixes are
796
797
  ignored if the PDOP is greater than this. Default is undef.
797
798
 
799
+ =item GeoHPosErr
800
+
801
+ Expression to set GPSHPositioningError based on value of GPSDOP when
802
+ geotagging. For example, use C<'$GPSDOP * 4'> to set GPSHPositioningError
803
+ to 4 times GPSDOP.
804
+
798
805
  =item GeoMinSats
799
806
 
800
807
  Minimum number of satellites for geotagging. GPS fixes are ignored if the
@@ -1082,13 +1089,14 @@ name documentation. Default is undef.
1082
1089
 
1083
1090
  =item RequestTags
1084
1091
 
1085
- List of additional tag and/or group names to request in the next call to
1092
+ List of additional tag and/or group names to request in subsequent calls to
1086
1093
  L</ExtractInfo>. This option is useful only for tags/groups which aren't
1087
- extracted unless specifically requested. Value may be a list reference, a
1088
- delimited string of names (any delimiter is allowed), or undef to clear the
1089
- current RequestTags list. Groups are requested by adding a colon after the
1090
- name (eg. "MacOS:"). Names are converted to lower case as they are added to
1091
- the list. Default is undef.
1094
+ extracted unless specifically requested, or if L</IgnoreTags> is set to
1095
+ "All". Value may be a list reference, a delimited string of names (any
1096
+ delimiter is allowed), or undef to clear the current RequestTags list.
1097
+ Groups are requested by adding a colon after the name (eg. "MacOS:"). Names
1098
+ are converted to lower case as they are added to the list. Default is
1099
+ undef.
1092
1100
 
1093
1101
  =item SaveBin
1094
1102