exiftool_vendored 13.04.0 → 13.08.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 +48 -0
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +30 -23
- data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/APE.pm +1 -1
- data/bin/lib/Image/ExifTool/ASF.pm +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +4 -3
- data/bin/lib/Image/ExifTool/Canon.pm +19 -1
- data/bin/lib/Image/ExifTool/DJI.pm +91 -29
- data/bin/lib/Image/ExifTool/Exif.pm +2 -2
- data/bin/lib/Image/ExifTool/FITS.pm +2 -2
- data/bin/lib/Image/ExifTool/FLIF.pm +2 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +11 -11
- data/bin/lib/Image/ExifTool/Font.pm +1 -1
- data/bin/lib/Image/ExifTool/Geolocation.pm +2 -1
- data/bin/lib/Image/ExifTool/GoPro.pm +3 -3
- data/bin/lib/Image/ExifTool/HP.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +3 -3
- data/bin/lib/Image/ExifTool/IPTC.pm +2 -2
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +19 -4
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +6 -6
- data/bin/lib/Image/ExifTool/M2TS.pm +39 -9
- data/bin/lib/Image/ExifTool/MXF.pm +2 -2
- data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/PDF.pm +15 -15
- data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
- data/bin/lib/Image/ExifTool/PNG.pm +4 -4
- data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
- data/bin/lib/Image/ExifTool/PhaseOne.pm +3 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +63 -3
- data/bin/lib/Image/ExifTool/Protobuf.pm +242 -0
- data/bin/lib/Image/ExifTool/QuickTime.pm +23 -14
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +395 -109
- data/bin/lib/Image/ExifTool/README +4 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
- data/bin/lib/Image/ExifTool/RTF.pm +1 -1
- data/bin/lib/Image/ExifTool/Ricoh.pm +3 -3
- data/bin/lib/Image/ExifTool/Sony.pm +4 -3
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +4 -3
- data/bin/lib/Image/ExifTool/TagLookup.pm +6988 -6967
- data/bin/lib/Image/ExifTool/TagNames.pod +85 -5
- data/bin/lib/Image/ExifTool/VCard.pm +2 -2
- data/bin/lib/Image/ExifTool/Validate.pm +3 -3
- data/bin/lib/Image/ExifTool/WriteExif.pl +2 -2
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +4 -4
- data/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
- data/bin/lib/Image/ExifTool/Writer.pl +17 -17
- data/bin/lib/Image/ExifTool/XMP.pm +20 -10
- data/bin/lib/Image/ExifTool/XMP2.pl +38 -0
- data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
- data/bin/lib/Image/ExifTool.pm +109 -82
- data/bin/lib/Image/ExifTool.pod +8 -7
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
12
12
|
=head1 TAG TABLES
|
13
13
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
15
|
-
They contain a total of
|
15
|
+
They contain a total of 28218 tags, with 17514 unique tag names.
|
16
16
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
@@ -115,6 +115,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
115
115
|
FPXR FlashPix
|
116
116
|
MPF MPF
|
117
117
|
InfiRayVersion InfiRay Version
|
118
|
+
UniformResourceName no
|
118
119
|
PreviewImage no
|
119
120
|
'APP3' Meta Kodak Meta
|
120
121
|
Stim Stim
|
@@ -152,6 +153,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
152
153
|
InfiRaySensor InfiRay Sensor
|
153
154
|
SEAL XMP SEAL
|
154
155
|
'APP10' Comment no
|
156
|
+
HDRGainCurve no
|
155
157
|
'APP11' JPEG-HDR JPEG HDR
|
156
158
|
JUMBF Jpeg2000
|
157
159
|
'APP12' PictureInfo APP12 PictureInfo
|
@@ -1370,6 +1372,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
|
|
1370
1372
|
acdsee XMP acdsee
|
1371
1373
|
acdsee-rs XMP ACDSeeRegions
|
1372
1374
|
album XMP Album
|
1375
|
+
apdi XMP apdi
|
1373
1376
|
apple-fi XMP apple_fi
|
1374
1377
|
ast Nikon ast
|
1375
1378
|
aux XMP aux
|
@@ -1402,6 +1405,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
|
|
1402
1405
|
GPano XMP GPano
|
1403
1406
|
GSpherical XMP GSpherical
|
1404
1407
|
hdr XMP hdr
|
1408
|
+
HDRGainMap XMP HDRGainMap
|
1405
1409
|
hdrgm XMP hdrgm
|
1406
1410
|
ics XMP ics
|
1407
1411
|
iptcCore XMP iptcCore
|
@@ -1584,6 +1588,18 @@ These tags belong to the ExifTool XMP-album family 1 group.
|
|
1584
1588
|
-------- --------
|
1585
1589
|
Notes string
|
1586
1590
|
|
1591
|
+
=head3 XMP apdi Tags
|
1592
|
+
|
1593
|
+
Used in Apple HDR GainMap images.
|
1594
|
+
|
1595
|
+
These tags belong to the ExifTool XMP-apdi family 1 group.
|
1596
|
+
|
1597
|
+
Tag Name Writable
|
1598
|
+
-------- --------
|
1599
|
+
AuxiliaryImageType string
|
1600
|
+
NativeFormat string
|
1601
|
+
StoredFormat string
|
1602
|
+
|
1587
1603
|
=head3 XMP apple_fi Tags
|
1588
1604
|
|
1589
1605
|
Face information tags written by the Apple iPhone 5 inside the mwg-rs
|
@@ -5030,6 +5046,16 @@ These tags belong to the ExifTool XMP-hdr family 1 group.
|
|
5030
5046
|
CCVWhiteXY string
|
5031
5047
|
SceneReferred boolean
|
5032
5048
|
|
5049
|
+
=head3 XMP HDRGainMap Tags
|
5050
|
+
|
5051
|
+
Used in Apple HDR GainMap images.
|
5052
|
+
|
5053
|
+
These tags belong to the ExifTool XMP-HDRGainMap family 1 group.
|
5054
|
+
|
5055
|
+
Tag Name Writable
|
5056
|
+
-------- --------
|
5057
|
+
HDRGainMapVersion string
|
5058
|
+
|
5033
5059
|
=head3 XMP hdrgm Tags
|
5034
5060
|
|
5035
5061
|
Tags used in Adobe gain map images.
|
@@ -8877,7 +8903,7 @@ access to this information.
|
|
8877
8903
|
0x0432 MeasurementScale? no
|
8878
8904
|
0x0433 TimelineInfo? no
|
8879
8905
|
0x0434 SheetDisclosure? no
|
8880
|
-
0x0435 ChannelOptions
|
8906
|
+
0x0435 ChannelOptions Photoshop ChannelOptions
|
8881
8907
|
0x0436 OnionSkins? no
|
8882
8908
|
0x0438 CountInfo? no
|
8883
8909
|
0x043a PrintInfo2? no
|
@@ -8940,6 +8966,15 @@ access to this information.
|
|
8940
8966
|
------ -------- --------
|
8941
8967
|
4 PixelAspectRatio no
|
8942
8968
|
|
8969
|
+
=head3 Photoshop ChannelOptions Tags
|
8970
|
+
|
8971
|
+
Index1 Tag Name Writable
|
8972
|
+
------ -------- --------
|
8973
|
+
0 ChannelColorSpace no
|
8974
|
+
2 ChannelColorData no
|
8975
|
+
11 ChannelOpacity no
|
8976
|
+
12 ChannelColorIndicates no
|
8977
|
+
|
8943
8978
|
=head3 Photoshop DocumentData Tags
|
8944
8979
|
|
8945
8980
|
Tag ID Tag Name Writable
|
@@ -9299,6 +9334,7 @@ Unknown only to reduce the volume of the normal output.
|
|
9299
9334
|
CanonCameraInfo1100D Canon CameraInfo600D
|
9300
9335
|
CanonCameraInfo1200D Canon CameraInfo60D
|
9301
9336
|
CanonCameraInfoR6 Canon CameraInfoR6
|
9337
|
+
CanonCameraInfoR6m2 Canon CameraInfoR6m2
|
9302
9338
|
CanonCameraInfoG5XII Canon CameraInfoG5XII
|
9303
9339
|
CanonCameraInfoPowerShot Canon CameraInfoPowerShot
|
9304
9340
|
CanonCameraInfoPowerShot2 Canon CameraInfoPowerShot2
|
@@ -10295,6 +10331,14 @@ CameraInfo tags for the EOS R5 and R6.
|
|
10295
10331
|
------ -------- --------
|
10296
10332
|
2801 ShutterCount int32u
|
10297
10333
|
|
10334
|
+
=head3 Canon CameraInfoR6m2 Tags
|
10335
|
+
|
10336
|
+
CameraInfo tags for the EOS R6 Mark II.
|
10337
|
+
|
10338
|
+
Index1 Tag Name Writable
|
10339
|
+
------ -------- --------
|
10340
|
+
3369 ShutterCount int32u
|
10341
|
+
|
10298
10342
|
=head3 Canon CameraInfoG5XII Tags
|
10299
10343
|
|
10300
10344
|
CameraInfo tags for the PowerShot G5 X Mark II.
|
@@ -12912,6 +12956,35 @@ Thermal parameters extracted from APP4 of some DJI RJPEG files.
|
|
12912
12956
|
8 Emissivity no
|
12913
12957
|
10 ReflectedTemperature no
|
12914
12958
|
|
12959
|
+
=head3 DJI Protobuf Tags
|
12960
|
+
|
12961
|
+
Tags found in protobuf-format DJI meta djmd and dbgi timed metadata. Only a
|
12962
|
+
few tags are currently known, but unknown djmd tags may be extracted by
|
12963
|
+
setting the Unknown option to 1 (or 2 to also extract unknown dbgi debug
|
12964
|
+
tags). Tag ID's are composed of the corresponding .proto file name combined
|
12965
|
+
with the hierarchical protobuf field numbers. The "dvtm_AVATA2.proto" file
|
12966
|
+
is used by the DJI Avanta 2, and "dvtm_ac203.proto" by the OsmoAction4.
|
12967
|
+
|
12968
|
+
Tag ID Tag Name Writable
|
12969
|
+
------ -------- --------
|
12970
|
+
'Protocol' Protocol no
|
12971
|
+
'dvtm_AVATA2_1-1-10' Model no
|
12972
|
+
'dvtm_AVATA2_2-2-3-1' SerialNumber no
|
12973
|
+
'dvtm_AVATA2_2-3-1' FrameWidth no
|
12974
|
+
'dvtm_AVATA2_2-3-2' FrameHeight no
|
12975
|
+
'dvtm_AVATA2_2-3-3' FrameRate no
|
12976
|
+
'dvtm_AVATA2_3-1-2' TimeStamp no
|
12977
|
+
'dvtm_AVATA2_3-4-4-1-2' GPSLatitude no
|
12978
|
+
'dvtm_AVATA2_3-4-4-1-3' GPSLongitude no
|
12979
|
+
'dvtm_ac203_1-1-10' Model no
|
12980
|
+
'dvtm_ac203_2-3-1' FrameWidth no
|
12981
|
+
'dvtm_ac203_2-3-2' FrameHeight no
|
12982
|
+
'dvtm_ac203_2-3-3' FrameRate no
|
12983
|
+
'dvtm_ac203_3-4-2-1-2' GPSLatitude no
|
12984
|
+
'dvtm_ac203_3-4-2-1-3' GPSLongitude no
|
12985
|
+
'dvtm_ac203_3-4-2-2' GPSAltitude no
|
12986
|
+
'dvtm_ac203_3-4-2-6-1' GPSDateTime no
|
12987
|
+
|
12915
12988
|
=head2 FLIR Tags
|
12916
12989
|
|
12917
12990
|
Information extracted from the maker notes of JPEG images from thermal
|
@@ -24770,7 +24843,9 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
|
|
24770
24843
|
'UNIT' Units? no
|
24771
24844
|
'VERS' MetadataVersion no
|
24772
24845
|
'VFOV' FieldOfView no
|
24846
|
+
'VFPS' VideoFrameRate no
|
24773
24847
|
'VFRH' VisualFlightRulesHUD no
|
24848
|
+
'VRES' VideoFrameSize no
|
24774
24849
|
'WBAL' ColorTemperatures no
|
24775
24850
|
'WNDM' WindProcessing no
|
24776
24851
|
'WRGB' WhiteBalanceRGB no
|
@@ -29936,13 +30011,14 @@ for the official QuickTime specification.
|
|
29936
30011
|
'sefd' SamsungTrailer Samsung Trailer
|
29937
30012
|
'skip' CanonSkip Canon Skip
|
29938
30013
|
PreviewImage no
|
29939
|
-
SkipInfo
|
30014
|
+
SkipInfo QuickTime Stream
|
30015
|
+
LigoGPSInfo -
|
29940
30016
|
Skip? no
|
29941
30017
|
'thm ' ThumbnailImage no
|
29942
30018
|
'thum' ThumbnailImage no
|
29943
30019
|
'udat' GPSLog no
|
29944
30020
|
'udta' KenwoodData QuickTime Stream
|
29945
|
-
|
30021
|
+
LigoJSON QuickTime Stream
|
29946
30022
|
FLIRData FLIR UserData
|
29947
30023
|
'uuid' XMP XMP
|
29948
30024
|
UUID-PROF QuickTime Profile
|
@@ -29962,7 +30038,7 @@ for the official QuickTime specification.
|
|
29962
30038
|
The tags below are extracted from timed metadata in QuickTime and other
|
29963
30039
|
formats of video files when the ExtractEmbedded option is used. Although
|
29964
30040
|
most of these tags are combined into the single table below, ExifTool
|
29965
|
-
currently reads
|
30041
|
+
currently reads 96 different types of timed GPS metadata from video files.
|
29966
30042
|
|
29967
30043
|
Tag Name Writable
|
29968
30044
|
-------- --------
|
@@ -29973,6 +30049,8 @@ currently reads 82 different formats of timed GPS metadata from video files.
|
|
29973
30049
|
CameraDateTime no
|
29974
30050
|
CameraModel no
|
29975
30051
|
Car no
|
30052
|
+
DJIDebug? DJI Protobuf
|
30053
|
+
DJIMetadata DJI Protobuf
|
29976
30054
|
DateTimeOriginal no
|
29977
30055
|
DateTimeStamp no
|
29978
30056
|
Distance no
|
@@ -30012,6 +30090,8 @@ currently reads 82 different formats of timed GPS metadata from video files.
|
|
30012
30090
|
Unknown01? no
|
30013
30091
|
Unknown02? no
|
30014
30092
|
Unknown03? no
|
30093
|
+
Unknown_H? no
|
30094
|
+
Unknown_M? no
|
30015
30095
|
UserLabel no
|
30016
30096
|
VerticalSpeed no
|
30017
30097
|
VideoTimeStamp no
|
@@ -325,7 +325,7 @@ sub ProcessVCard($$)
|
|
325
325
|
$$et{DOC_NUM} = ++$$et{DOC_COUNT}; # read next card as a new document
|
326
326
|
}
|
327
327
|
unless ($val =~ s/^([-A-Za-z0-9.]+)//) {
|
328
|
-
$et->
|
328
|
+
$et->Warn("Unrecognized line in $lbl file");
|
329
329
|
next;
|
330
330
|
}
|
331
331
|
my $tag = $1;
|
@@ -379,7 +379,7 @@ sub ProcessVCard($$)
|
|
379
379
|
$param{$p} = '';
|
380
380
|
}
|
381
381
|
}
|
382
|
-
$val =~ s/^:// or $et->
|
382
|
+
$val =~ s/^:// or $et->Warn("Invalid line in $lbl file"), next;
|
383
383
|
# add 'Type' parameter to id and name if it exists
|
384
384
|
$param{Type} and $tag .= $param{Type}, $name .= $param{Type};
|
385
385
|
# convert base64-encoded data
|
@@ -421,7 +421,7 @@ sub ValidateExif($$$$$$$$)
|
|
421
421
|
{
|
422
422
|
my ($et, $tagTablePtr, $tag, $tagInfo, $lastTag, $ifd, $count, $formatStr) = @_;
|
423
423
|
|
424
|
-
$et->
|
424
|
+
$et->Warn("Entries in $ifd are out of order") if $tag <= $lastTag;
|
425
425
|
|
426
426
|
# (get tagInfo for unknown tags if Unknown option not used)
|
427
427
|
if (not defined $tagInfo and $$tagTablePtr{$tag} and ref $$tagTablePtr{$tag} eq 'HASH') {
|
@@ -532,8 +532,8 @@ sub ValidateOffsetInfo($$$;$)
|
|
532
532
|
while (@offsets) {
|
533
533
|
my $start = pop @offsets;
|
534
534
|
my $end = $start + pop @sizes;
|
535
|
-
$et->
|
536
|
-
$et->
|
535
|
+
$et->Warn("$dirName:$$offsets[0]{Name} is zero", $minor) if $start == 0;
|
536
|
+
$et->Warn("$dirName:$$sizes[0]{Name} is zero", $minor) if $start == $end;
|
537
537
|
next unless $end > $fileSize;
|
538
538
|
if ($start >= $fileSize) {
|
539
539
|
if ($start == 0xffffffff) {
|
@@ -387,8 +387,8 @@ sub ValidateImageData($$$;$)
|
|
387
387
|
}
|
388
388
|
push @bitsPerSample, $bitsPerSample[0] while @bitsPerSample < $samplesPerPix;
|
389
389
|
foreach (@bitsPerSample) {
|
390
|
-
$et->
|
391
|
-
$et->
|
390
|
+
$et->Warn("$dirName BitsPerSample values are different", $minor) if $_ ne $bitsPerSample[0];
|
391
|
+
$et->Warn("Invalid $dirName BitsPerSample value", $minor) if $_ < 1 or $_ > 32;
|
392
392
|
}
|
393
393
|
}
|
394
394
|
my $bitsPerPixel = 0;
|
@@ -339,7 +339,7 @@ sub FormatQTValue($$;$$)
|
|
339
339
|
$flags = 0x01; # UTF8
|
340
340
|
$$valPt = $et->Encode($$valPt, 'UTF8');
|
341
341
|
}
|
342
|
-
defined $$valPt or $et->
|
342
|
+
defined $$valPt or $et->Warn("Error converting value for $$tagInfo{Name}");
|
343
343
|
return $flags;
|
344
344
|
}
|
345
345
|
|
@@ -548,7 +548,7 @@ sub WriteItemInfo($$$)
|
|
548
548
|
$buff = $v2;
|
549
549
|
$wasDeflated = 1;
|
550
550
|
} else {
|
551
|
-
$et->
|
551
|
+
$et->Warn("Error inflating $name metadata");
|
552
552
|
next;
|
553
553
|
}
|
554
554
|
}
|
@@ -683,7 +683,7 @@ sub WriteItemInfo($$$)
|
|
683
683
|
# write compressed XMP if Compress option is set
|
684
684
|
if ($et->Options('Compress') and length $newVal) {
|
685
685
|
if (not eval { require Compress::Zlib }) {
|
686
|
-
$et->
|
686
|
+
$et->Warn('Install Compress::Zlib to write compressed metadata');
|
687
687
|
} else {
|
688
688
|
my $deflate = Compress::Zlib::deflateInit();
|
689
689
|
if ($deflate) {
|
@@ -973,7 +973,7 @@ sub WriteQuickTime($$$)
|
|
973
973
|
$et->Error('End of processing at large atom (LargeFileSupport not enabled)');
|
974
974
|
last;
|
975
975
|
} elsif ($et->Options('LargeFileSupport') eq '2') {
|
976
|
-
$et->
|
976
|
+
$et->Warn('Processing large atom (LargeFileSupport is 2)');
|
977
977
|
}
|
978
978
|
}
|
979
979
|
$size = $hi * 4294967296 + $lo - 16;
|
@@ -112,7 +112,7 @@ sub ValidateProperty($$;$)
|
|
112
112
|
my $valLang = $$et{XmpValidateLangAlt} || ($$et{XmpValidateLangAlt} = { });
|
113
113
|
$$valLang{$langPath} or $$valLang{$langPath} = { };
|
114
114
|
if ($$valLang{$langPath}{$lang}) {
|
115
|
-
$et->
|
115
|
+
$et->Warn("Duplicate language ($lang) in lang-alt list: $langPath");
|
116
116
|
} else {
|
117
117
|
$$valLang{$langPath}{$lang} = 1;
|
118
118
|
}
|
@@ -984,7 +984,7 @@ sub WriteXMP($$;$)
|
|
984
984
|
(not @fixInfo or $fixInfo[0] ne $info);
|
985
985
|
pop @props;
|
986
986
|
}
|
987
|
-
$et->
|
987
|
+
$et->Warn("Error finding parent structure for $$tagInfo{Name}") unless @fixInfo;
|
988
988
|
}
|
989
989
|
# fix property path for this tag (last in the @fixInfo list)
|
990
990
|
push @fixInfo, $tagInfo unless @fixInfo and $isStruct;
|
@@ -1299,10 +1299,10 @@ sub SetNewValuesFromFile($$;@)
|
|
1299
1299
|
ExtractEmbedded FastScan Filter FixBase Geolocation GeolocAltNames
|
1300
1300
|
GeolocFeature GeolocMinPop GeolocMaxDist GlobalTimeShift HexTagIDs
|
1301
1301
|
IgnoreGroups IgnoreMinorErrors IgnoreTags ImageHashType Lang
|
1302
|
-
LargeFileSupport ListItem ListSep MDItemTags MissingTagValue
|
1303
|
-
NoWarning Password PrintConv QuickTimeUTC RequestTags SaveFormat
|
1304
|
-
ScanForXMP StructFormat SystemTags TimeZone Unknown UserParam
|
1305
|
-
WindowsLongPath WindowsWideFile XAttrTags XMPAutoConv))
|
1302
|
+
LargeFileSupport LigoGPSScale ListItem ListSep MDItemTags MissingTagValue
|
1303
|
+
NoPDFList NoWarning Password PrintConv QuickTimeUTC RequestTags SaveFormat
|
1304
|
+
SavePath ScanForXMP StructFormat SystemTags TimeZone Unknown UserParam
|
1305
|
+
Validate WindowsLongPath WindowsWideFile XAttrTags XMPAutoConv))
|
1306
1306
|
{
|
1307
1307
|
$srcExifTool->Options($_ => $$options{$_});
|
1308
1308
|
}
|
@@ -1749,7 +1749,7 @@ GNV_TagInfo: foreach $tagInfo (@tagInfoList) {
|
|
1749
1749
|
my $err = &$checkProc($self, $tagInfo, \$val);
|
1750
1750
|
if ($err or not defined $val) {
|
1751
1751
|
$err or $err = 'Error generating raw value';
|
1752
|
-
$self->
|
1752
|
+
$self->Warn("$err for $$tagInfo{Name}");
|
1753
1753
|
@$vals = ();
|
1754
1754
|
last;
|
1755
1755
|
}
|
@@ -1769,7 +1769,7 @@ GNV_TagInfo: foreach $tagInfo (@tagInfoList) {
|
|
1769
1769
|
# an empty warning ("\n") ignores tag with no error
|
1770
1770
|
if ($evalWarning ne "\n") {
|
1771
1771
|
my $err = CleanWarning() . " in $$tagInfo{Name} (RawConvInv)";
|
1772
|
-
$self->
|
1772
|
+
$self->Warn($err);
|
1773
1773
|
}
|
1774
1774
|
@$vals = ();
|
1775
1775
|
last;
|
@@ -1953,8 +1953,8 @@ sub SetFileModifyDate($$;$$$)
|
|
1953
1953
|
}
|
1954
1954
|
my ($aTime, $mTime, $cTime);
|
1955
1955
|
if ($tag eq 'FileCreateDate') {
|
1956
|
-
eval { require Win32::API } or $self->
|
1957
|
-
eval { require Win32API::File } or $self->
|
1956
|
+
eval { require Win32::API } or $self->Warn("Install Win32::API to set $tag"), return -1;
|
1957
|
+
eval { require Win32API::File } or $self->Warn("Install Win32API::File to set $tag"), return -1;
|
1958
1958
|
$cTime = $val;
|
1959
1959
|
} else {
|
1960
1960
|
$aTime = $mTime = $val;
|
@@ -2151,7 +2151,7 @@ sub SetSystemTags($$)
|
|
2151
2151
|
$self->VerboseValue('+ FilePermissions', $perm);
|
2152
2152
|
$result = 1;
|
2153
2153
|
} else {
|
2154
|
-
$self->
|
2154
|
+
$self->Warn('Error setting FilePermissions');
|
2155
2155
|
$result = -1;
|
2156
2156
|
}
|
2157
2157
|
}
|
@@ -2165,7 +2165,7 @@ sub SetSystemTags($$)
|
|
2165
2165
|
$self->VerboseValue('+ FileGroupID', $gid) if $gid >= 0;
|
2166
2166
|
$result = 1;
|
2167
2167
|
} else {
|
2168
|
-
$self->
|
2168
|
+
$self->Warn('Error setting FileGroup/UserID');
|
2169
2169
|
$result = -1 unless $result;
|
2170
2170
|
}
|
2171
2171
|
}
|
@@ -2181,7 +2181,7 @@ sub SetSystemTags($$)
|
|
2181
2181
|
$result = $res if $res == 1 or not $result;
|
2182
2182
|
last;
|
2183
2183
|
} elsif ($tag ne 'FileCreateDate') {
|
2184
|
-
$self->
|
2184
|
+
$self->Warn('Can only set MDItem tags on MacOS');
|
2185
2185
|
last;
|
2186
2186
|
}
|
2187
2187
|
}
|
@@ -2194,7 +2194,7 @@ sub SetSystemTags($$)
|
|
2194
2194
|
} elsif (ref $file) {
|
2195
2195
|
$self->Warn('Writing ZoneIdentifer requires a file name');
|
2196
2196
|
} elsif (defined $self->GetNewValue('ZoneIdentifier', \$zhash)) {
|
2197
|
-
$self->Warn('ZoneIndentifier may only be
|
2197
|
+
$self->Warn('ZoneIndentifier may only be deleted');
|
2198
2198
|
} elsif (not eval { require Win32API::File }) {
|
2199
2199
|
$self->Warn('Install Win32API::File to write ZoneIdentifier');
|
2200
2200
|
} else {
|
@@ -4266,7 +4266,7 @@ sub WriteDirectory($$$;$)
|
|
4266
4266
|
# allow MakerNotes to be deleted from ExifIFD of CR3 file
|
4267
4267
|
not ($self->IsRawType() == 2 and $parent eq 'ExifIFD'))
|
4268
4268
|
{
|
4269
|
-
$self->
|
4269
|
+
$self->Warn("Can't delete $1 from $$self{FileType}",1);
|
4270
4270
|
undef $grp1;
|
4271
4271
|
} elsif (not $blockExifTypes{$$self{FILE_TYPE}}) {
|
4272
4272
|
# restrict delete logic to prevent entire tiff image from being killed
|
@@ -6430,7 +6430,7 @@ sub WriteJPEG($$)
|
|
6430
6430
|
# warn of subsequent XMP blocks specifying a different
|
6431
6431
|
# HasExtendedXMP (have never seen this)
|
6432
6432
|
if ($goodGuid and $goodGuid ne $2) {
|
6433
|
-
$self->
|
6433
|
+
$self->Warn('Multiple XMP segments specifying different extended XMP GUID');
|
6434
6434
|
}
|
6435
6435
|
$goodGuid = $2; # GUID for the standard extended XMP
|
6436
6436
|
}
|
@@ -6578,7 +6578,7 @@ sub WriteJPEG($$)
|
|
6578
6578
|
undef $$segDataPt;
|
6579
6579
|
next Marker;
|
6580
6580
|
} elsif (defined $chunkNum) {
|
6581
|
-
$self->
|
6581
|
+
$self->Warn('Invalid or extraneous ICC_Profile chunk(s)');
|
6582
6582
|
# fall through to preserve this extra profile...
|
6583
6583
|
}
|
6584
6584
|
} elsif ($$segDataPt =~ /^FPXR\0/) {
|
@@ -6985,9 +6985,9 @@ sub SetFileTime($$;$$$$)
|
|
6985
6985
|
# on Windows, try to work around incorrect file times when daylight saving time is in effect
|
6986
6986
|
if ($^O eq 'MSWin32') {
|
6987
6987
|
if (not eval { require Win32::API }) {
|
6988
|
-
$self->
|
6988
|
+
$self->Warn('Install Win32::API for proper handling of Windows file times');
|
6989
6989
|
} elsif (not eval { require Win32API::File }) {
|
6990
|
-
$self->
|
6990
|
+
$self->Warn('Install Win32API::File for proper handling of Windows file times');
|
6991
6991
|
} else {
|
6992
6992
|
# get Win32 handle, needed for SetFileTime
|
6993
6993
|
my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
|
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
|
|
50
50
|
use Image::ExifTool::GPS;
|
51
51
|
require Exporter;
|
52
52
|
|
53
|
-
$VERSION = '3.
|
53
|
+
$VERSION = '3.70';
|
54
54
|
@ISA = qw(Exporter);
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
56
56
|
|
@@ -207,6 +207,8 @@ my %xmpNS = (
|
|
207
207
|
# Note: Google uses a prefix of 'Container', but this conflicts with the
|
208
208
|
# Device Container namespace, also by Google. So call this one GContainer
|
209
209
|
GContainer=> 'http://ns.google.com/photos/1.0/container/',
|
210
|
+
HDRGainMap=> 'http://ns.apple.com/HDRGainMap/1.0/',
|
211
|
+
apdi => 'http://ns.apple.com/pixeldatainfo/1.0/',
|
210
212
|
);
|
211
213
|
|
212
214
|
# build reverse namespace lookup
|
@@ -934,6 +936,14 @@ my %sRangeMask = (
|
|
934
936
|
Name => 'xmpDSA',
|
935
937
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::DSA' },
|
936
938
|
},
|
939
|
+
HDRGainMap => {
|
940
|
+
Name => 'HDRGainMap',
|
941
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::HDRGainMap' },
|
942
|
+
},
|
943
|
+
apdi => {
|
944
|
+
Name => 'apdi',
|
945
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::apdi' },
|
946
|
+
},
|
937
947
|
seal => {
|
938
948
|
Name => 'seal',
|
939
949
|
SubDirectory => { TagTable => 'Image::ExifTool::XMP::seal' },
|
@@ -2839,7 +2849,7 @@ sub FullEscapeXML($)
|
|
2839
2849
|
$str =~ s/\\/\/sg; # escape backslashes too
|
2840
2850
|
# then use C-escape sequences for invalid characters
|
2841
2851
|
if ($str =~ /[\0-\x1f]/ or Image::ExifTool::IsUTF8(\$str) < 0) {
|
2842
|
-
$str =~ s/([\0-\x1f\
|
2852
|
+
$str =~ s/([\0-\x1f\x7f-\xff])/sprintf("\\x%.2x",ord $1)/sge;
|
2843
2853
|
}
|
2844
2854
|
return $str;
|
2845
2855
|
}
|
@@ -3620,9 +3630,9 @@ NoLoop:
|
|
3620
3630
|
}
|
3621
3631
|
if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean' and $val!~/^True|False$/) {
|
3622
3632
|
if ($val =~ /^true|false$/) {
|
3623
|
-
$et->
|
3633
|
+
$et->Warn("Boolean value for XMP-$ns:$$tagInfo{Name} should be capitalized",1);
|
3624
3634
|
} else {
|
3625
|
-
$et->
|
3635
|
+
$et->Warn(qq(Boolean value for XMP-$ns:$$tagInfo{Name} should be "True" or "False"),1);
|
3626
3636
|
}
|
3627
3637
|
}
|
3628
3638
|
# protect against large binary data in unknown tags
|
@@ -3813,7 +3823,7 @@ sub ParseXMPElement($$$;$$$$)
|
|
3813
3823
|
$stdNS = $uri2ns{$try};
|
3814
3824
|
if ($stdNS) {
|
3815
3825
|
$val = $try;
|
3816
|
-
$et->
|
3826
|
+
$et->Warn("Fixed incorrect URI for xmlns:$ns", 1);
|
3817
3827
|
} elsif ($val =~ m(^http://ns.nikon.com/BASIC_PARAM)) {
|
3818
3828
|
$et->OverrideFileType('NXD','application/x-nikon-nxd');
|
3819
3829
|
} else {
|
@@ -3894,9 +3904,9 @@ sub ParseXMPElement($$$;$$$$)
|
|
3894
3904
|
if ($nItems == 1000) {
|
3895
3905
|
my ($tg,$ns) = GetXMPTagID($propList);
|
3896
3906
|
if ($isWriting) {
|
3897
|
-
$et->
|
3907
|
+
$et->Warn("Excessive number of items for $ns:$tg. Processing may be slow", 1);
|
3898
3908
|
} elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) {
|
3899
|
-
$et->
|
3909
|
+
$et->Warn("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
|
3900
3910
|
last;
|
3901
3911
|
}
|
3902
3912
|
}
|
@@ -3996,12 +4006,12 @@ sub ParseXMPElement($$$;$$$$)
|
|
3996
4006
|
} elsif ($$et{XmpAbout} ne $attrs{$shortName}) {
|
3997
4007
|
if ($isWriting) {
|
3998
4008
|
my $str = "Different 'rdf:about' attributes not handled";
|
3999
|
-
unless ($$et{
|
4009
|
+
unless ($$et{WAS_WARNED}{$str}) {
|
4000
4010
|
$et->Error($str, 1);
|
4001
|
-
$$et{
|
4011
|
+
$$et{WAS_WARNED}{$str} = 1;
|
4002
4012
|
}
|
4003
4013
|
} elsif ($$et{XmpValidate}) {
|
4004
|
-
$et->
|
4014
|
+
$et->Warn("Different 'rdf:about' attributes");
|
4005
4015
|
}
|
4006
4016
|
}
|
4007
4017
|
}
|
@@ -2250,6 +2250,44 @@ my %sACDSeeRegionStruct = (
|
|
2250
2250
|
Gamma => { Writable => 'real', List => 'Seq', Avoid => 1 },
|
2251
2251
|
);
|
2252
2252
|
|
2253
|
+
%Image::ExifTool::XMP::HDRGainMap = (
|
2254
|
+
%xmpTableDefaults,
|
2255
|
+
GROUPS => { 1 => 'XMP-HDRGainMap', 2 => 'Unknown' },
|
2256
|
+
NAMESPACE => 'HDRGainMap',
|
2257
|
+
NOTES => 'Used in Apple HDR GainMap images.',
|
2258
|
+
HDRGainMapVersion => {
|
2259
|
+
PrintConv => 'IsInt($val) ? join(".",unpack("C*", pack "N", $val)) : $val',
|
2260
|
+
PrintConvInv => q{
|
2261
|
+
return $val unless $val =~ /^\d+\.\d+\.\d+\.\d+$/;
|
2262
|
+
return unpack('N', pack('C*', split /\./, $val));
|
2263
|
+
},
|
2264
|
+
},
|
2265
|
+
);
|
2266
|
+
|
2267
|
+
%Image::ExifTool::XMP::apdi = (
|
2268
|
+
%xmpTableDefaults,
|
2269
|
+
GROUPS => { 1 => 'XMP-apdi', 2 => 'Image' },
|
2270
|
+
NAMESPACE => 'apdi',
|
2271
|
+
NOTES => 'Used in Apple HDR GainMap images.',
|
2272
|
+
NativeFormat => {
|
2273
|
+
PrintConv => q{
|
2274
|
+
return $val unless IsInt($val);
|
2275
|
+
my $tmp = pack("N", $val);
|
2276
|
+
$tmp =~ /^\w{4}$/ ? $tmp : $val;
|
2277
|
+
},
|
2278
|
+
PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
|
2279
|
+
},
|
2280
|
+
AuxiliaryImageType => { },
|
2281
|
+
StoredFormat => {
|
2282
|
+
PrintConv => q{
|
2283
|
+
return $val unless IsInt($val);
|
2284
|
+
my $tmp = pack("N", $val);
|
2285
|
+
$tmp =~ /^\w{4}$/ ? $tmp : $val;
|
2286
|
+
},
|
2287
|
+
PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
|
2288
|
+
},
|
2289
|
+
);
|
2290
|
+
|
2253
2291
|
# SVG namespace properties (ref 9)
|
2254
2292
|
%Image::ExifTool::XMP::SVG = (
|
2255
2293
|
GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
|
@@ -330,7 +330,7 @@ sub ProcessRAR($$)
|
|
330
330
|
$et->Warn('Large block encountered. Aborting.');
|
331
331
|
last;
|
332
332
|
} elsif ($et->Options('LargeFileSupport') eq '2') {
|
333
|
-
$et->
|
333
|
+
$et->Warn('Processing large block (LargeFileSupport is 2)');
|
334
334
|
}
|
335
335
|
}
|
336
336
|
# process the block
|