exiftool_vendored 12.41.0 → 12.50.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +209 -6
- data/bin/MANIFEST +12 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +45 -44
- data/bin/config_files/acdsee.config +2 -1
- data/bin/config_files/frameCount.config +56 -0
- data/bin/config_files/tiff_version.config +1 -1
- data/bin/exiftool +115 -96
- data/bin/fmt_files/gpx.fmt +3 -0
- data/bin/fmt_files/gpx_wpt.fmt +3 -0
- data/bin/lib/Image/ExifTool/Apple.pm +16 -3
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
- data/bin/lib/Image/ExifTool/Canon.pm +71 -33
- data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
- data/bin/lib/Image/ExifTool/DJI.pm +60 -1
- data/bin/lib/Image/ExifTool/DNG.pm +8 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
- data/bin/lib/Image/ExifTool/EXE.pm +9 -1
- data/bin/lib/Image/ExifTool/Exif.pm +26 -12
- data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
- data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
- data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
- data/bin/lib/Image/ExifTool/GPS.pm +21 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +12 -9
- data/bin/lib/Image/ExifTool/ICO.pm +143 -0
- data/bin/lib/Image/ExifTool/ID3.pm +11 -11
- data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
- data/bin/lib/Image/ExifTool/LNK.pm +5 -2
- data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MISB.pm +494 -0
- data/bin/lib/Image/ExifTool/MakerNotes.pm +8 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
- data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +293 -122
- data/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
- data/bin/lib/Image/ExifTool/Olympus.pm +22 -2
- data/bin/lib/Image/ExifTool/PDF.pm +2 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +30 -4
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
- data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +35 -8
- data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
- data/bin/lib/Image/ExifTool/README +13 -3
- data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
- data/bin/lib/Image/ExifTool/Samsung.pm +234 -3
- data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
- data/bin/lib/Image/ExifTool/Sony.pm +71 -43
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4752 -4516
- data/bin/lib/Image/ExifTool/TagNames.pod +1885 -1434
- data/bin/lib/Image/ExifTool/Text.pm +3 -4
- data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
- data/bin/lib/Image/ExifTool/Validate.pm +3 -3
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
- data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
- data/bin/lib/Image/ExifTool/Writer.pl +14 -6
- data/bin/lib/Image/ExifTool/XMP.pm +78 -59
- data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
- data/bin/lib/Image/ExifTool.pm +120 -33
- data/bin/lib/Image/ExifTool.pod +83 -69
- data/bin/perl-Image-ExifTool.spec +43 -43
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +9 -4
@@ -538,10 +538,11 @@ my %sImageRegion = ( # new in 1.5
|
|
538
538
|
NAMESPACE => 'Iptc4xmpExt',
|
539
539
|
TABLE_DESC => 'XMP IPTC Extension',
|
540
540
|
NOTES => q{
|
541
|
-
This table contains tags defined by the IPTC Extension schema version 1.
|
542
|
-
|
543
|
-
the family 1 group name. (
|
544
|
-
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>
|
541
|
+
This table contains tags defined by the IPTC Extension schema version 1.7
|
542
|
+
and IPTC Video Metadata version 1.3. The actual namespace prefix is
|
543
|
+
"Iptc4xmpExt", but ExifTool shortens this for the family 1 group name. (See
|
544
|
+
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/> and
|
545
|
+
L<https://iptc.org/standards/video-metadata-hub/>.)
|
545
546
|
},
|
546
547
|
AboutCvTerm => {
|
547
548
|
Struct => \%sCVTermDetails,
|
@@ -682,6 +683,7 @@ my %sImageRegion = ( # new in 1.5
|
|
682
683
|
ProductName => { Writable => 'lang-alt' },
|
683
684
|
ProductGTIN => { },
|
684
685
|
ProductDescription => { Writable => 'lang-alt' },
|
686
|
+
ProductId => { }, # added in version 2022.1
|
685
687
|
},
|
686
688
|
List => 'Bag',
|
687
689
|
},
|
@@ -796,6 +798,12 @@ my %sImageRegion = ( # new in 1.5
|
|
796
798
|
},
|
797
799
|
PlanningRef => { List => 'Bag', Struct => \%sEntityWithRole },
|
798
800
|
audioBitsPerSample => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
|
801
|
+
# new IPTC video metadata 1.3 properties
|
802
|
+
# (ref https://iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.3.html)
|
803
|
+
metadataLastEdited => { Groups => { 2 => 'Time' }, %dateTimeInfo },
|
804
|
+
metadataLastEditor => { Struct => \%sEntity },
|
805
|
+
metadataAuthority => { Struct => \%sEntity },
|
806
|
+
parentId => { Name => 'ParentID' },
|
799
807
|
# new IPTC Extension schema 1.5 property
|
800
808
|
ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
|
801
809
|
# new Extension 1.6 property
|
@@ -1518,6 +1526,7 @@ my %sSubVersion = (
|
|
1518
1526
|
ImageHistory => { Avoid => 1, Notes => 'different format from EXIF:ImageHistory' },
|
1519
1527
|
LensCorrectionSettings => { },
|
1520
1528
|
ImageUniqueID => { Avoid => 1 },
|
1529
|
+
picasawebGPhotoId => { }, #forum14108
|
1521
1530
|
);
|
1522
1531
|
|
1523
1532
|
# SWF namespace tags (ref PH)
|
@@ -1847,6 +1856,11 @@ my %sSubVersion = (
|
|
1847
1856
|
MicroVideoVersion => { Writable => 'integer' },
|
1848
1857
|
MicroVideoOffset => { Writable => 'integer' },
|
1849
1858
|
MicroVideoPresentationTimestampUs => { Writable => 'integer' },
|
1859
|
+
shot_log_data => { #forum14108
|
1860
|
+
Name => 'ShotLogData',
|
1861
|
+
ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
|
1862
|
+
ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
|
1863
|
+
},
|
1850
1864
|
);
|
1851
1865
|
|
1852
1866
|
# Google creations namespace (ref PH)
|
@@ -1856,6 +1870,7 @@ my %sSubVersion = (
|
|
1856
1870
|
NAMESPACE => 'GCreations',
|
1857
1871
|
NOTES => 'Google creations tags.',
|
1858
1872
|
CameraBurstID => { },
|
1873
|
+
Type => { Avoid => 1 },
|
1859
1874
|
);
|
1860
1875
|
|
1861
1876
|
# Google depth-map Device namespace (ref 13)
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -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.
|
32
|
+
$VERSION = '12.50';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
@@ -139,8 +139,8 @@ sub ReadValue($$$;$$$);
|
|
139
139
|
@loadAllTables = qw(
|
140
140
|
PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw Lytro MinoltaRaw PanasonicRaw
|
141
141
|
SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BMP::Extra BPG BPG::Extensions
|
142
|
-
PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC LIF MRC::FEI12 MIFF PCX
|
143
|
-
PSP PhotoCD Radiance Other::PFM PDF PostScript Photoshop::Header
|
142
|
+
ICO PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC LIF MRC::FEI12 MIFF PCX
|
143
|
+
PGF PSP PhotoCD Radiance Other::PFM PDF PostScript Photoshop::Header
|
144
144
|
Photoshop::Layers Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD
|
145
145
|
Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3
|
146
146
|
FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio
|
@@ -191,11 +191,12 @@ $defaultLang = 'en'; # default language
|
|
191
191
|
HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2
|
192
192
|
CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS
|
193
193
|
MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA PDB
|
194
|
-
PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD TXT);
|
194
|
+
PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO TXT);
|
195
195
|
|
196
196
|
# file types that we can write (edit)
|
197
197
|
my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
|
198
|
-
X3F PS PDF ICC VRD DR4 JP2 JXL EXIF AI AIT IND MOV EXV FLIF
|
198
|
+
X3F PS PDF ICC VRD DR4 JP2 JXL EXIF AI AIT IND MOV EXV FLIF
|
199
|
+
RIFF);
|
199
200
|
my %writeTypes; # lookup for writable file types (hash filled if required)
|
200
201
|
|
201
202
|
# file extensions that we can't write for various base types
|
@@ -205,6 +206,8 @@ my %writeTypes; # lookup for writable file types (hash filled if required)
|
|
205
206
|
JP2 => [ qw(J2C JPC) ],
|
206
207
|
MOV => [ qw(INSV) ],
|
207
208
|
);
|
209
|
+
# file extensions that we can only write for various base types
|
210
|
+
my %onlyWriteFile = ( RIFF => [ qw(WEBP) ] );
|
208
211
|
|
209
212
|
# file types that we can create from scratch
|
210
213
|
# - must update CanCreate() documentation if this list is changed!
|
@@ -257,6 +260,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
257
260
|
CRW => ['CRW', 'Canon RAW format'],
|
258
261
|
CS1 => ['PSD', 'Sinar CaptureShop 1-Shot RAW'],
|
259
262
|
CSV => ['TXT', 'Comma-Separated Values'],
|
263
|
+
CUR => ['ICO', 'Windows Cursor'],
|
260
264
|
CZI => ['CZI', 'Zeiss Integrated Software RAW'],
|
261
265
|
DC3 => 'DICM',
|
262
266
|
DCM => 'DICM',
|
@@ -333,6 +337,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
333
337
|
ICAL => 'ICS',
|
334
338
|
ICC => ['ICC', 'International Color Consortium'],
|
335
339
|
ICM => 'ICC',
|
340
|
+
ICO => ['ICO', 'Windows Icon'],
|
336
341
|
ICS => ['VCard','iCalendar Schedule'],
|
337
342
|
IDML => ['ZIP', 'Adobe InDesign Markup Language'],
|
338
343
|
IIQ => ['TIFF', 'Phase One Intelligent Image Quality RAW'],
|
@@ -378,6 +383,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
378
383
|
M4B => ['MOV', 'MPEG-4 audio Book'],
|
379
384
|
M4P => ['MOV', 'MPEG-4 Protected'],
|
380
385
|
M4V => ['MOV', 'MPEG-4 Video'],
|
386
|
+
MACOS=> ['MacOS','MacOS ._ sidecar file'],
|
381
387
|
MAX => ['FPX', '3D Studio MAX'],
|
382
388
|
MEF => ['TIFF', 'Mamiya (RAW) Electronic Format'],
|
383
389
|
MIE => ['MIE', 'Meta Information Encapsulation format'],
|
@@ -407,7 +413,6 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
407
413
|
NEF => ['TIFF', 'Nikon (RAW) Electronic Format'],
|
408
414
|
NEWER => 'COS',
|
409
415
|
NKSC => ['XMP', 'Nikon Sidecar'],
|
410
|
-
|
411
416
|
NMBTEMPLATE => ['ZIP','Apple Numbers Template'],
|
412
417
|
NRW => ['TIFF', 'Nikon RAW (2)'],
|
413
418
|
NUMBERS => ['ZIP','Apple Numbers spreadsheet'],
|
@@ -530,7 +535,6 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
530
535
|
WMV => ['ASF', 'Windows Media Video'],
|
531
536
|
WV => ['RIFF', 'WavePack lossless audio'],
|
532
537
|
X3F => ['X3F', 'Sigma RAW format'],
|
533
|
-
MACOS=> ['MacOS','MacOS ._ sidecar file'],
|
534
538
|
XCF => ['XCF', 'GIMP native image format'],
|
535
539
|
XHTML=> ['HTML', 'Extensible HyperText Markup Language'],
|
536
540
|
XLA => ['FPX', 'Microsoft Excel Add-in'],
|
@@ -599,6 +603,7 @@ my %fileDescription = (
|
|
599
603
|
CRM => 'video/x-canon-crm',
|
600
604
|
CRW => 'image/x-canon-crw',
|
601
605
|
CSV => 'text/csv',
|
606
|
+
CUR => 'image/x-cursor', #PH (NC)
|
602
607
|
CZI => 'image/x-zeiss-czi', #PH (NC)
|
603
608
|
DCP => 'application/octet-stream', #PH (NC)
|
604
609
|
DCR => 'image/x-kodak-dcr',
|
@@ -647,6 +652,7 @@ my %fileDescription = (
|
|
647
652
|
HDR => 'image/vnd.radiance',
|
648
653
|
HTML => 'text/html',
|
649
654
|
ICC => 'application/vnd.iccprofile',
|
655
|
+
ICO => 'image/x-icon', #PH (NC)
|
650
656
|
ICS => 'text/calendar',
|
651
657
|
IDML => 'application/vnd.adobe.indesign-idml-package',
|
652
658
|
IIQ => 'image/x-raw',
|
@@ -913,6 +919,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
|
|
913
919
|
HDR => '#\?(RADIANCE|RGBE)\x0a',
|
914
920
|
HTML => '(\xef\xbb\xbf)?\s*(?i)<(!DOCTYPE\s+HTML|HTML|\?xml)', # (case insensitive)
|
915
921
|
ICC => '.{12}(scnr|mntr|prtr|link|spac|abst|nmcl|nkpf|cenc|mid |mlnk|mvis)(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR|nc..|\0{4}){2}',
|
922
|
+
ICO => '\0\0[\x01\x02]\0[^0]\0', # (reasonably assume that the file contains less than 256 images)
|
916
923
|
IND => '\x06\x06\xed\xf5\xd8\x1d\x46\xe5\xbd\x31\xef\xe7\xfe\x74\xb7\x1d',
|
917
924
|
# ISO => signature is at byte 32768
|
918
925
|
ITC => '.{4}itch',
|
@@ -925,6 +932,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
|
|
925
932
|
LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
|
926
933
|
LRI => 'LELR \0',
|
927
934
|
M2TS => '(....)?\x47',
|
935
|
+
MacOS=> '\0\x05\x16\x07\0.\0\0Mac OS X ',
|
928
936
|
MIE => '~[\x10\x18]\x04.0MIE',
|
929
937
|
MIFF => 'id=ImageMagick',
|
930
938
|
MKV => '\x1a\x45\xdf\xa3',
|
@@ -972,7 +980,6 @@ $testLen = 1024; # number of bytes to read when testing for magic number
|
|
972
980
|
WMF => '(\xd7\xcd\xc6\x9a\0\0|\x01\0\x09\0\0\x03)',
|
973
981
|
WTV => '\xb7\xd8\x00\x20\x37\x49\xda\x11\xa6\x4e\x00\x07\xe9\x5e\xad\x8d',
|
974
982
|
X3F => 'FOVb',
|
975
|
-
MacOS=> '\0\x05\x16\x07\0.\0\0Mac OS X ',
|
976
983
|
XCF => 'gimp xcf ',
|
977
984
|
XMP => '\0{0,3}(\xfe\xff|\xff\xfe|\xef\xbb\xbf)?\0{0,3}\s*<',
|
978
985
|
ZIP => 'PK\x03\x04',
|
@@ -2209,6 +2216,20 @@ sub Options($$;@)
|
|
2209
2216
|
} else {
|
2210
2217
|
$$options{$param} = undef; # clear the list
|
2211
2218
|
}
|
2219
|
+
} elsif ($param eq 'IgnoreTags') {
|
2220
|
+
if (defined $newVal) {
|
2221
|
+
# parse list from delimited string if necessary
|
2222
|
+
my @ignoreList = (ref $newVal eq 'ARRAY') ? @$newVal : ($newVal =~ /[-\w?*:]+/g);
|
2223
|
+
ExpandShortcuts(\@ignoreList);
|
2224
|
+
# add to existing tags to ignore
|
2225
|
+
$$options{$param} or $$options{$param} = { };
|
2226
|
+
foreach (@ignoreList) {
|
2227
|
+
/^(.*:)?([-\w?*]+)#?$/ or next;
|
2228
|
+
$$options{$param}{lc $2} = 1;
|
2229
|
+
}
|
2230
|
+
} else {
|
2231
|
+
$$options{$param} = undef; # clear the option
|
2232
|
+
}
|
2212
2233
|
} elsif ($param eq 'ListJoin') {
|
2213
2234
|
$$options{$param} = $newVal;
|
2214
2235
|
# set the old List and ListSep options for backward compatibility
|
@@ -2321,6 +2342,7 @@ sub ClearOptions($)
|
|
2321
2342
|
HtmlDump => 0, # HTML dump (0-3, higher # = bigger limit)
|
2322
2343
|
HtmlDumpBase => undef, # base address for HTML dump
|
2323
2344
|
IgnoreMinorErrors => undef, # ignore minor errors when reading/writing
|
2345
|
+
IgnoreTags => undef, # list of tags to ignore when extracting
|
2324
2346
|
Lang => $defaultLang,# localized language for descriptions etc
|
2325
2347
|
LargeFileSupport => undef, # flag indicating support of 64-bit file offsets
|
2326
2348
|
List => undef, # extract lists of PrintConv values into arrays [no longer documented]
|
@@ -3860,6 +3882,10 @@ sub CanWrite($)
|
|
3860
3882
|
my $ext = GetFileExtension($file) || uc($file);
|
3861
3883
|
return grep(/^$ext$/, @{$noWriteFile{$type}}) ? 0 : 1 if $ext;
|
3862
3884
|
}
|
3885
|
+
if ($onlyWriteFile{$type}) {
|
3886
|
+
my $ext = GetFileExtension($file) || uc($file);
|
3887
|
+
return grep(/^$ext$/, @{$onlyWriteFile{$type}}) ? 1 : 0 if $ext;
|
3888
|
+
}
|
3863
3889
|
unless (%writeTypes) {
|
3864
3890
|
$writeTypes{$_} = 1 foreach @writeTypes;
|
3865
3891
|
}
|
@@ -4027,6 +4053,57 @@ sub NextTagKey($$)
|
|
4027
4053
|
return undef;
|
4028
4054
|
}
|
4029
4055
|
|
4056
|
+
#------------------------------------------------------------------------------
|
4057
|
+
# Does a string contain valid UTF-8 characters?
|
4058
|
+
# Inputs: 0) string reference, 1) true to allow last character to be truncated
|
4059
|
+
# Returns: 0=regular ASCII, -1=invalid UTF-8, 1=valid UTF-8 with maximum 16-bit
|
4060
|
+
# wide characters, 2=valid UTF-8 requiring 32-bit wide characters
|
4061
|
+
# Notes: Changes current string position
|
4062
|
+
# (see http://www.fileformat.info/info/unicode/utf8.htm for help understanding this)
|
4063
|
+
sub IsUTF8($;$)
|
4064
|
+
{
|
4065
|
+
my ($strPt, $trunc) = @_;
|
4066
|
+
pos($$strPt) = 0; # start at beginning of string
|
4067
|
+
return 0 unless $$strPt =~ /([\x80-\xff])/g;
|
4068
|
+
my $rtnVal = 1;
|
4069
|
+
for (;;) {
|
4070
|
+
my $ch = ord($1);
|
4071
|
+
# minimum lead byte for 2-byte sequence is 0xc2 (overlong sequences
|
4072
|
+
# not allowed), 0xf8-0xfd are restricted by RFC 3629 (no 5 or 6 byte
|
4073
|
+
# sequences), and 0xfe and 0xff are not valid in UTF-8 strings
|
4074
|
+
return -1 if $ch < 0xc2 or $ch >= 0xf8;
|
4075
|
+
# determine number of bytes remaining in sequence
|
4076
|
+
my $n;
|
4077
|
+
if ($ch < 0xe0) {
|
4078
|
+
$n = 1;
|
4079
|
+
} elsif ($ch < 0xf0) {
|
4080
|
+
$n = 2;
|
4081
|
+
} else {
|
4082
|
+
$n = 3;
|
4083
|
+
# character code is greater than 0xffff if more than 2 extra bytes
|
4084
|
+
# were required in the UTF-8 character
|
4085
|
+
$rtnVal = 2;
|
4086
|
+
}
|
4087
|
+
my $pos = pos $$strPt;
|
4088
|
+
unless ($$strPt =~ /\G([\x80-\xbf]{$n})/g) {
|
4089
|
+
return $rtnVal if $trunc and $pos + $n > length $$strPt;
|
4090
|
+
return -1;
|
4091
|
+
}
|
4092
|
+
# the following is ref https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c
|
4093
|
+
if ($n == 2) {
|
4094
|
+
return -1 if ($ch == 0xe0 and (ord($1) & 0xe0) == 0x80) or
|
4095
|
+
($ch == 0xed and (ord($1) & 0xe0) == 0xa0) or
|
4096
|
+
($ch == 0xef and ord($1) == 0xbf and
|
4097
|
+
(ord(substr $1, 1) & 0xfe) == 0xbe);
|
4098
|
+
} else {
|
4099
|
+
return -1 if ($ch == 0xf0 and (ord($1) & 0xf0) == 0x80) or
|
4100
|
+
($ch == 0xf4 and ord($1) > 0x8f) or $ch > 0xf4;
|
4101
|
+
}
|
4102
|
+
last unless $$strPt =~ /([\x80-\xff])/g;
|
4103
|
+
}
|
4104
|
+
return $rtnVal;
|
4105
|
+
}
|
4106
|
+
|
4030
4107
|
#------------------------------------------------------------------------------
|
4031
4108
|
# Split file name into directory and name parts
|
4032
4109
|
# Inptus: 0) file name
|
@@ -4072,10 +4149,7 @@ sub EncodeFileName($$;$)
|
|
4072
4149
|
}
|
4073
4150
|
}
|
4074
4151
|
} elsif ($^O eq 'MSWin32' and $file =~ /[\x80-\xff]/ and not defined $enc) {
|
4075
|
-
|
4076
|
-
if (Image::ExifTool::XMP::IsUTF8(\$file) < 0) {
|
4077
|
-
$self->WarnOnce('FileName encoding not specified');
|
4078
|
-
}
|
4152
|
+
$self->WarnOnce('FileName encoding not specified') if IsUTF8(\$file) < 0;
|
4079
4153
|
}
|
4080
4154
|
return 0;
|
4081
4155
|
}
|
@@ -5689,8 +5763,8 @@ sub ConvertDateTime($$)
|
|
5689
5763
|
$a[4] -= 1; # base month is 1
|
5690
5764
|
# parse our %f fractional seconds first (and round up seconds if necessary)
|
5691
5765
|
# - if there are multiple %f codes, they all get the same number of digits as the first
|
5692
|
-
if ($fmt =~
|
5693
|
-
my $dig = $1;
|
5766
|
+
if ($fmt =~ /%(-?)\.?(\d*)f/) {
|
5767
|
+
my ($neg, $dig) = ($1, $2);
|
5694
5768
|
my $frac = $date =~ /(\.\d+)/ ? $1 : '';
|
5695
5769
|
if (not $frac) {
|
5696
5770
|
$frac = '.' . ('0' x $dig) if $dig;
|
@@ -5717,7 +5791,8 @@ sub ConvertDateTime($$)
|
|
5717
5791
|
}
|
5718
5792
|
}
|
5719
5793
|
}
|
5720
|
-
$
|
5794
|
+
$neg and $frac =~ s/^\.//;
|
5795
|
+
$fmt =~ s/(^|[^%])((%%)*)%-?\.?\d*f/$1$2$frac/g;
|
5721
5796
|
}
|
5722
5797
|
# parse %z and %s ourself (to handle time zones properly)
|
5723
5798
|
if ($fmt =~ /%[sz]/) {
|
@@ -5863,7 +5938,7 @@ sub GetUnixTime($;$)
|
|
5863
5938
|
{
|
5864
5939
|
my ($timeStr, $isLocal) = @_;
|
5865
5940
|
return 0 if $timeStr eq '0000:00:00 00:00:00';
|
5866
|
-
my @tm = ($timeStr =~ /^(\d+)
|
5941
|
+
my @tm = ($timeStr =~ /^(\d+)[-:](\d+)[-:](\d+)\s+(\d+):(\d+):(\d+)(.*)/);
|
5867
5942
|
return undef unless @tm == 7;
|
5868
5943
|
unless (eval { require Time::Local }) {
|
5869
5944
|
warn "Time::Local is not installed\n";
|
@@ -5896,13 +5971,13 @@ sub GetUnixTime($;$)
|
|
5896
5971
|
sub ConvertFileSize($)
|
5897
5972
|
{
|
5898
5973
|
my $val = shift;
|
5899
|
-
$val <
|
5900
|
-
$val <
|
5901
|
-
$val <
|
5902
|
-
$val <
|
5903
|
-
$val <
|
5904
|
-
$val <
|
5905
|
-
return sprintf('%.0f
|
5974
|
+
$val < 2000 and return "$val bytes";
|
5975
|
+
$val < 10000 and return sprintf('%.1f kB', $val / 1000);
|
5976
|
+
$val < 2000000 and return sprintf('%.0f kB', $val / 1000);
|
5977
|
+
$val < 10000000 and return sprintf('%.1f MB', $val / 1000000);
|
5978
|
+
$val < 2000000000 and return sprintf('%.0f MB', $val / 1000000);
|
5979
|
+
$val < 10000000000 and return sprintf('%.1f GB', $val / 1000000000);
|
5980
|
+
return sprintf('%.0f GB', $val / 1000000000);
|
5906
5981
|
}
|
5907
5982
|
|
5908
5983
|
#------------------------------------------------------------------------------
|
@@ -7686,8 +7761,8 @@ sub DoProcessTIFF($$;$)
|
|
7686
7761
|
# check DNG version
|
7687
7762
|
if ($$self{DNGVersion}) {
|
7688
7763
|
my $ver = $$self{DNGVersion};
|
7689
|
-
# currently support up to DNG version 1.
|
7690
|
-
unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.
|
7764
|
+
# currently support up to DNG version 1.6
|
7765
|
+
unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.6) {
|
7691
7766
|
$ver =~ tr/ /./;
|
7692
7767
|
$self->Error("DNG Version $ver not yet tested", 1);
|
7693
7768
|
}
|
@@ -7955,11 +8030,11 @@ sub GetTagInfo($$$;$$$)
|
|
7955
8030
|
next;
|
7956
8031
|
}
|
7957
8032
|
}
|
7958
|
-
|
7959
|
-
|
7960
|
-
|
8033
|
+
# don't return Unknown tags unless that option is set (also see forum13716)
|
8034
|
+
if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not
|
8035
|
+
($$self{OPTIONS}{Verbose} or $$self{HTML_DUMP} or
|
8036
|
+
($$self{OPTIONS}{Validate} and not $$tagInfo{AddedUnknown})))
|
7961
8037
|
{
|
7962
|
-
# don't return Unknown tags unless that option is set
|
7963
8038
|
return undef;
|
7964
8039
|
}
|
7965
8040
|
# return the tag information we found
|
@@ -7984,6 +8059,7 @@ sub GetTagInfo($$$;$$$)
|
|
7984
8059
|
Unknown => 1,
|
7985
8060
|
Writable => 0, # can't write unknown tags
|
7986
8061
|
PrintConv => $printConv,
|
8062
|
+
AddedUnknown => 1,
|
7987
8063
|
};
|
7988
8064
|
# add tag information to table
|
7989
8065
|
AddTagToTable($tagTablePtr, $tagID, $tagInfo);
|
@@ -8045,6 +8121,7 @@ sub AddTagToTable($$;$$)
|
|
8045
8121
|
unless (defined $$tagTablePtr{$tagID} or $specialTags{$tagID}) {
|
8046
8122
|
$$tagTablePtr{$tagID} = $tagInfo;
|
8047
8123
|
}
|
8124
|
+
$$tagInfo{AddedUnknown} = 1 if $$tagInfo{Unknown};
|
8048
8125
|
return $tagInfo;
|
8049
8126
|
}
|
8050
8127
|
|
@@ -8187,15 +8264,17 @@ sub FoundTag($$$;@)
|
|
8187
8264
|
{
|
8188
8265
|
local $_;
|
8189
8266
|
my ($self, $tagInfo, $value, @grps) = @_;
|
8190
|
-
my ($tag, $noListDel);
|
8267
|
+
my ($tag, $noListDel, $tbl);
|
8191
8268
|
my $options = $$self{OPTIONS};
|
8192
8269
|
|
8193
8270
|
if (ref $tagInfo eq 'HASH') {
|
8194
8271
|
$tag = $$tagInfo{Name} or warn("No tag name\n"), return undef;
|
8272
|
+
$tbl = $$tagInfo{Table};
|
8195
8273
|
} else {
|
8196
8274
|
$tag = $tagInfo;
|
8197
8275
|
# look for tag in Extra
|
8198
|
-
$
|
8276
|
+
$tbl = GetTagTable('Image::ExifTool::Extra');
|
8277
|
+
$tagInfo = $self->GetTagInfo($tbl, $tag);
|
8199
8278
|
# make temporary hash if tag doesn't exist in Extra
|
8200
8279
|
# (not advised to do this since the tag won't show in list)
|
8201
8280
|
$tagInfo or $tagInfo = { Name => $tag, Groups => \%allGroupsExifTool };
|
@@ -8204,7 +8283,7 @@ sub FoundTag($$$;@)
|
|
8204
8283
|
# get tag priority
|
8205
8284
|
my $priority = $$tagInfo{Priority};
|
8206
8285
|
unless (defined $priority) {
|
8207
|
-
$priority = $$
|
8286
|
+
$priority = $$tbl{PRIORITY};
|
8208
8287
|
$priority = 0 if not defined $priority and $$tagInfo{Avoid};
|
8209
8288
|
}
|
8210
8289
|
$grps[0] or $grps[0] = $$self{SET_GROUP0};
|
@@ -8233,6 +8312,14 @@ sub FoundTag($$$;@)
|
|
8233
8312
|
$self->Warn("RawConv $tag: " . CleanWarning()) if $evalWarning;
|
8234
8313
|
return undef unless defined $value;
|
8235
8314
|
}
|
8315
|
+
# ignore specified tags (AFTER doing RawConv if necessary!)
|
8316
|
+
if ($$options{IgnoreTags}) {
|
8317
|
+
if ($$options{IgnoreTags}{all}) {
|
8318
|
+
return undef unless $$self{REQ_TAG_LOOKUP}{lc $tag};
|
8319
|
+
} else {
|
8320
|
+
return undef if $$options{IgnoreTags}{lc $tag};
|
8321
|
+
}
|
8322
|
+
}
|
8236
8323
|
# handle duplicate tag names
|
8237
8324
|
if (defined $$valueHash{$tag}) {
|
8238
8325
|
# add to list if there is an active list for this tag
|
@@ -8444,7 +8531,7 @@ sub SetFileType($;$$$)
|
|
8444
8531
|
|
8445
8532
|
#------------------------------------------------------------------------------
|
8446
8533
|
# Override the FileType and MIMEType tags
|
8447
|
-
# Inputs: 0) ExifTool object ref, 1) file type, 2) MIME type, 3) normal extension
|
8534
|
+
# Inputs: 0) ExifTool object ref, 1) file type, 2) MIME type, 3) normal extension (lower case)
|
8448
8535
|
# Notes: does nothing if FileType was not previously defined (ie. when writing)
|
8449
8536
|
sub OverrideFileType($$;$$)
|
8450
8537
|
{
|