exiftool_vendored 13.04.0 → 13.08.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.
- 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
|