exiftool_vendored 11.92.0 → 11.93.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +20 -1
- data/bin/MANIFEST +2 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/pix4d.config +99 -0
- data/bin/exiftool +18 -10
- data/bin/lib/Image/ExifTool.pm +60 -18
- data/bin/lib/Image/ExifTool.pod +7 -4
- data/bin/lib/Image/ExifTool/Canon.pm +19 -1
- data/bin/lib/Image/ExifTool/Charset.pm +6 -5
- data/bin/lib/Image/ExifTool/Charset/DOSCyrillic.pm +49 -0
- data/bin/lib/Image/ExifTool/Exif.pm +11 -1
- data/bin/lib/Image/ExifTool/HtmlDump.pm +21 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +1 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +3 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +102 -89
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35973dd75b32b6d82a5a536d999a230d6de7d4ea
|
4
|
+
data.tar.gz: 32dfaf005408997c53a45689ad2f43be57f6e7fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9cf45bb1c1a72a24e13039cc127b6f1df3252281b0fede8e4544fa64be18373a90445b0813622b9dc6cf4b7718a2f31915b39381189f20bc3dfae5b9c03af5f2
|
7
|
+
data.tar.gz: 0f4deebac460423820bb9d5fd22e652153676031ec720e1b20a1f24288116364ffc801ac6cfb31d958b1acd7aa0c02a72d0d221eeff5e4bd287ad42e03379f14
|
data/bin/Changes
CHANGED
@@ -7,11 +7,30 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 11.85. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to CPAN.)
|
9
9
|
|
10
|
+
Apr. 3, 2020 - Version 11.93
|
11
|
+
|
12
|
+
- Added new config file to the distribution for writing Pix4D XMP-Camera tags
|
13
|
+
(config_files/pix4d.config)
|
14
|
+
- Added support for the DOSCyrillic (cp866) character set
|
15
|
+
- Added IO::String to the Windows EXE version
|
16
|
+
- Improved identification of Canon RF lenses (thanks LibRaw)
|
17
|
+
- Enhanced -htmlDump output to add "File offset" entry for EXIF tags and
|
18
|
+
ability lock highlighted selection by clicking the mouse
|
19
|
+
- Enhanced -srcfile option to generate OriginalFileName and OriginalDirectory
|
20
|
+
UserParam tags
|
21
|
+
- Patched HEIC writer to add missing pitm box if necessary
|
22
|
+
- Fixed problem adding back EXIF after deleting it from HEIC file
|
23
|
+
- Fixed minor problem with incorrect number of bytes being reported for
|
24
|
+
invalid header in corrupt files
|
25
|
+
- API Changes:
|
26
|
+
- Enhanced UserParam option to allow parameters to be extracted as if
|
27
|
+
they were a normal tag
|
28
|
+
|
10
29
|
Mar. 19, 2020 - Version 11.92
|
11
30
|
|
12
31
|
- Added a new Nikon LensID (thanks Wolfgang Exler)
|
13
32
|
- Decode a few new Leica tags (thanks Tim Gray)
|
14
|
-
- Decode
|
33
|
+
- Decode AccelerometerData from Samsung Gear 360 videos
|
15
34
|
- Fixed a couple of problems decoding timed GPS metadata from NextBase dashcam
|
16
35
|
videos
|
17
36
|
- Fixed problem where -X option could produce invalid XML when reading
|
data/bin/MANIFEST
CHANGED
@@ -26,6 +26,7 @@ config_files/gps2utm.config
|
|
26
26
|
config_files/nksc.config
|
27
27
|
config_files/photoshop_paths.config
|
28
28
|
config_files/picasa_faces.config
|
29
|
+
config_files/pix4d.config
|
29
30
|
config_files/rotate_regions.config
|
30
31
|
config_files/tiff_version.config
|
31
32
|
config_files/time_zone.config
|
@@ -220,6 +221,7 @@ lib/Image/ExifTool/Charset.pm
|
|
220
221
|
lib/Image/ExifTool/Charset/Arabic.pm
|
221
222
|
lib/Image/ExifTool/Charset/Baltic.pm
|
222
223
|
lib/Image/ExifTool/Charset/Cyrillic.pm
|
224
|
+
lib/Image/ExifTool/Charset/DOSCyrillic.pm
|
223
225
|
lib/Image/ExifTool/Charset/DOSLatin1.pm
|
224
226
|
lib/Image/ExifTool/Charset/DOSLatinUS.pm
|
225
227
|
lib/Image/ExifTool/Charset/Greek.pm
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -105,8 +105,8 @@ your home directory, then you would type the following commands in a
|
|
105
105
|
terminal window to extract and run ExifTool:
|
106
106
|
|
107
107
|
cd ~/Desktop
|
108
|
-
gzip -dc Image-ExifTool-11.
|
109
|
-
cd Image-ExifTool-11.
|
108
|
+
gzip -dc Image-ExifTool-11.93.tar.gz | tar -xf -
|
109
|
+
cd Image-ExifTool-11.93
|
110
110
|
./exiftool t/images/ExifTool.jpg
|
111
111
|
|
112
112
|
Note: These commands extract meta information from one of the test images.
|
@@ -0,0 +1,99 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# File: pix4d.config
|
3
|
+
#
|
4
|
+
# Description: This config file contains tag definitions needed to be able
|
5
|
+
# to write Pix4D XMP-Camera tags
|
6
|
+
#
|
7
|
+
# Usage: exiftool -config pix4d.config -XMP-camera:TAG=VAL ...
|
8
|
+
#
|
9
|
+
# Requires: ExifTool version 7.00 or later
|
10
|
+
#
|
11
|
+
# References: 1) https://support.pix4d.com/hc/en-us/articles/360016450032-Specifications-of-xmpcamera-tags
|
12
|
+
#
|
13
|
+
# Revisions: 2017/12/08 - P. Harvey Created
|
14
|
+
# 2020/04/02 - PH Updated to current specification
|
15
|
+
#------------------------------------------------------------------------------
|
16
|
+
|
17
|
+
%Image::ExifTool::UserDefined = (
|
18
|
+
'Image::ExifTool::XMP::Main' => {
|
19
|
+
Camera => {
|
20
|
+
SubDirectory => {
|
21
|
+
TagTable => 'Image::ExifTool::UserDefined::Camera',
|
22
|
+
},
|
23
|
+
},
|
24
|
+
},
|
25
|
+
);
|
26
|
+
|
27
|
+
%Image::ExifTool::UserDefined::Camera = (
|
28
|
+
GROUPS => { 0 => 'XMP', 1 => 'XMP-Camera', 2 => 'Camera' },
|
29
|
+
NAMESPACE => { 'Camera' => 'http://pix4d.com/camera/1.0/' },
|
30
|
+
WRITABLE => 'string',
|
31
|
+
Yaw => { Writable => 'real' },
|
32
|
+
Pitch => { Writable => 'real' },
|
33
|
+
Roll => { Writable => 'real' },
|
34
|
+
IMUSampleSize => { Writable => 'integer' },
|
35
|
+
IMUTimeOffset => { Writable => 'integer' },
|
36
|
+
LineReadoutTime => { Writable => 'integer' },
|
37
|
+
IMUFrequency => { Writable => 'real' },
|
38
|
+
PrincipalPoint => { },
|
39
|
+
ModelType => { },
|
40
|
+
PerspectiveFocalLength => { Writable => 'real' },
|
41
|
+
PerspectiveDistortion => { },
|
42
|
+
IMULinearVelocity => { },
|
43
|
+
GPSXYAccuracy => { Writable => 'real' },
|
44
|
+
GPSZAccuracy => { Writable => 'real' },
|
45
|
+
FlightUUID => { },
|
46
|
+
CentralWaveLength => { },
|
47
|
+
BandName => { List => 'Seq' },
|
48
|
+
RigName => { },
|
49
|
+
RigCameraIndex => { Writable => 'integer' },
|
50
|
+
BandName => { List => 'Seq' },
|
51
|
+
IMUAngularVelocity => {
|
52
|
+
Binary => 1,
|
53
|
+
ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
|
54
|
+
ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
|
55
|
+
},
|
56
|
+
# added 2020/04/02 (ref 1)
|
57
|
+
FisheyeAffineMatrix => { },
|
58
|
+
FisheyeAffineSymmetric => { },
|
59
|
+
FisheyePolynomial => { },
|
60
|
+
RigRelatives => { },
|
61
|
+
PerspectiveFocalLengthUnits => { },
|
62
|
+
CaptureUUID => { },
|
63
|
+
CentralWavelength => { List => 'Seq' },
|
64
|
+
WavelengthFWHM => { List => 'Seq' },
|
65
|
+
BlackCurrent => { List => 'Seq' },
|
66
|
+
BandSensitivity => { List => 'Seq' },
|
67
|
+
SunSensor => { List => 'Seq' },
|
68
|
+
SunSensorExposureTime => { List => 'Seq' },
|
69
|
+
SunSensorSensitivity => { List => 'Seq' },
|
70
|
+
InvalidPixel => { List => 'Seq' },
|
71
|
+
VignettingPolynomial => { List => 'Seq' },
|
72
|
+
VignettingCenter => { List => 'Seq' },
|
73
|
+
VignettingPolynomial2DName => { List => 'Seq' },
|
74
|
+
VignettingPolynomial2D => { List => 'Seq' },
|
75
|
+
ColorTransform => { List => 'Seq' },
|
76
|
+
IsNormalized => { },
|
77
|
+
Albedo => { List => 'Seq' },
|
78
|
+
ReflectArea => { List => 'Seq' },
|
79
|
+
CalibrationPicture => { Writable => 'integer' },
|
80
|
+
GyroRate => { Writable => 'real' },
|
81
|
+
IMUPitchAccuracy => { Writable => 'real' },
|
82
|
+
IMURollAccuracy => { Writable => 'real' },
|
83
|
+
IMUYawAccuracy => { Writable => 'real' },
|
84
|
+
NominalCameraDistance => { Writable => 'real' },
|
85
|
+
AboveGroundAltitude => { Writable => 'real' },
|
86
|
+
SunSensorYaw => { Writable => 'real' },
|
87
|
+
SunSensorPitch => { Writable => 'real' },
|
88
|
+
SunSensorRoll => { Writable => 'real' },
|
89
|
+
SunSensorRelativeRotation => { Writable => 'real', List => 'Seq' },
|
90
|
+
TransformAlpha => { List => 'Seq' },
|
91
|
+
TransformBeta => { List => 'Seq' },
|
92
|
+
TransformGamma => { List => 'Seq' },
|
93
|
+
SensorBitDepth => { Writable => 'integer' },
|
94
|
+
SensorTemperature => { Writable => 'real' },
|
95
|
+
# (ref https://community.pix4d.com/t/camera-sun-irradiance-and-sun-angle-in-red-text/3290)
|
96
|
+
IrradianceRelativeRotation => { },
|
97
|
+
);
|
98
|
+
|
99
|
+
1; #end
|
data/bin/exiftool
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
use strict;
|
11
11
|
require 5.004;
|
12
12
|
|
13
|
-
my $version = '11.
|
13
|
+
my $version = '11.93';
|
14
14
|
|
15
15
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
16
16
|
my $exeDir;
|
@@ -1887,6 +1887,9 @@ sub GetImageInfo($$)
|
|
1887
1887
|
$first = $file unless defined $first;
|
1888
1888
|
}
|
1889
1889
|
$file = $first if defined $first;
|
1890
|
+
my ($d, $f) = Image::ExifTool::SplitFileName($orig);
|
1891
|
+
$et->Options(UserParam => "OriginalDirectory#=$d");
|
1892
|
+
$et->Options(UserParam => "OriginalFileName#=$f");
|
1890
1893
|
} else {
|
1891
1894
|
$file = $orig;
|
1892
1895
|
}
|
@@ -4867,6 +4870,7 @@ available character sets is returned. Valid I<CHARSET> values are:
|
|
4867
4870
|
Thai cp874 Windows Thai
|
4868
4871
|
DOSLatinUS cp437 DOS Latin US
|
4869
4872
|
DOSLatin1 cp850 DOS Latin1
|
4873
|
+
DOSCyrillic cp866 DOS Cyrillic
|
4870
4874
|
MacRoman cp10000, Roman Macintosh Roman
|
4871
4875
|
MacLatin2 cp10029 Macintosh Latin2 (Central Europe)
|
4872
4876
|
MacCyrillic cp10007 Macintosh Cyrillic
|
@@ -5206,7 +5210,7 @@ with this command:
|
|
5206
5210
|
|
5207
5211
|
produces output like this:
|
5208
5212
|
|
5209
|
-
-- Generated by ExifTool 11.
|
5213
|
+
-- Generated by ExifTool 11.93 --
|
5210
5214
|
File: a.jpg - 2003:10:31 15:44:19
|
5211
5215
|
(f/5.6, 1/60s, ISO 100)
|
5212
5216
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6178,6 +6182,10 @@ A I<FMT> of C<@> may be used to represent the original I<FILE>, which may be
|
|
6178
6182
|
useful when specifying multiple B<-srcfile> options (eg. to fall back to
|
6179
6183
|
processing the original I<FILE> if no sidecar exists).
|
6180
6184
|
|
6185
|
+
When this option is used, two special UserParam tags (OriginalFileName and
|
6186
|
+
OriginalDirectory) are generated to allow access to the original I<FILE>
|
6187
|
+
name and directory.
|
6188
|
+
|
6181
6189
|
=item B<-stay_open> I<FLAG>
|
6182
6190
|
|
6183
6191
|
If I<FLAG> is C<1> or C<True>, causes exiftool keep reading from the B<-@>
|
@@ -6227,15 +6235,15 @@ necessary when using this technique.)
|
|
6227
6235
|
|
6228
6236
|
=item B<-userParam> I<PARAM[[^]=[VAL]]>
|
6229
6237
|
|
6230
|
-
Set user parameter. I<PARAM> is an arbitrary user parameter name. This
|
6231
|
-
|
6238
|
+
Set user parameter. I<PARAM> is an arbitrary user parameter name. This is
|
6239
|
+
an interface to the API UserParam option (see the
|
6232
6240
|
L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and
|
6233
|
-
provides a method to access user-defined parameters
|
6234
|
-
|
6235
|
-
|
6236
|
-
the B<-api> option, the parameter
|
6237
|
-
|
6238
|
-
I<VAL> is omitted with C<^=>.
|
6241
|
+
provides a method to access user-defined parameters in arguments to the
|
6242
|
+
B<-if> and B<-p> options as if they were any other tag. Appending a hash
|
6243
|
+
tag (C<#>) to I<PARAM> also causes the parameter to be extracted as a normal
|
6244
|
+
tag (in the UserParam group). Similar to the B<-api> option, the parameter
|
6245
|
+
value is set to 1 if I<=VAL> is omitted, undef if just I<VAL> is omitted
|
6246
|
+
with C<=>, or an empty string if I<VAL> is omitted with C<^=>.
|
6239
6247
|
|
6240
6248
|
exiftool -p '$test from $filename' -userparam test=Hello FILE
|
6241
6249
|
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
28
28
|
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
|
30
30
|
|
31
|
-
$VERSION = '11.
|
31
|
+
$VERSION = '11.93';
|
32
32
|
$RELEASE = '';
|
33
33
|
@ISA = qw(Exporter);
|
34
34
|
%EXPORT_TAGS = (
|
@@ -118,6 +118,7 @@ sub NewGUID();
|
|
118
118
|
sub MakeTiffHeader($$$$;$$);
|
119
119
|
|
120
120
|
# other subroutine definitions
|
121
|
+
sub SplitFileName($);
|
121
122
|
sub EncodeFileName($$;$);
|
122
123
|
sub Open($*$;$);
|
123
124
|
sub Exists($$);
|
@@ -982,6 +983,7 @@ my %xmpShorthandOpt = ( 0 => 'None', 1 => 'Shorthand', 2 => ['Shorthand','OneDes
|
|
982
983
|
thai => 'Thai', cp874 => 'Thai',
|
983
984
|
doslatinus => 'DOSLatinUS', cp437 => 'DOSLatinUS',
|
984
985
|
doslatin1 => 'DOSLatin1', cp850 => 'DOSLatin1',
|
986
|
+
doscyrillic => 'DOSCyrillic', cp866 => 'DOSCyrillic',
|
985
987
|
macroman => 'MacRoman', cp10000 => 'MacRoman', mac => 'MacRoman', roman => 'MacRoman',
|
986
988
|
maclatin2 => 'MacLatin2', cp10029 => 'MacLatin2',
|
987
989
|
maccyrillic => 'MacCyrillic', cp10007 => 'MacCyrillic',
|
@@ -1723,6 +1725,12 @@ my %systemTagsNotes = (
|
|
1723
1725
|
},
|
1724
1726
|
);
|
1725
1727
|
|
1728
|
+
# tags defined by UserParam option (added at runtime)
|
1729
|
+
%Image::ExifTool::UserParam = (
|
1730
|
+
GROUPS => { 0 => 'UserParam', 1 => 'UserParam', 2 => 'Other' },
|
1731
|
+
PRIORITY => 0,
|
1732
|
+
);
|
1733
|
+
|
1726
1734
|
# YCbCrSubSampling values (used by JPEG SOF, EXIF and XMP)
|
1727
1735
|
%Image::ExifTool::JPEG::yCbCrSubSampling = (
|
1728
1736
|
'1 1' => 'YCbCr4:4:4 (1 1)', #PH
|
@@ -2063,31 +2071,45 @@ sub Options($$;@)
|
|
2063
2071
|
} elsif ($param eq 'UserParam') {
|
2064
2072
|
# clear options if $newVal is undef
|
2065
2073
|
defined $newVal or $$options{$param} = {}, next;
|
2074
|
+
my $table = GetTagTable('Image::ExifTool::UserParam');
|
2066
2075
|
# allow initialization of entire UserParam hash
|
2067
2076
|
if (ref $newVal eq 'HASH') {
|
2068
2077
|
my %newParams;
|
2069
|
-
|
2078
|
+
foreach (sort keys %$newVal) {
|
2079
|
+
my $lcTag = lc $_;
|
2080
|
+
$newParams{$lcTag} = $$newVal{$_};
|
2081
|
+
delete $$table{$lcTag};
|
2082
|
+
AddTagToTable($table, $lcTag, $_);
|
2083
|
+
}
|
2070
2084
|
$$options{$param} = \%newParams;
|
2071
2085
|
next;
|
2072
2086
|
}
|
2073
|
-
my $force;
|
2087
|
+
my ($force, $paramName);
|
2074
2088
|
# set/reset single UserParam parameter
|
2075
2089
|
if ($newVal =~ /(.*?)=(.*)/s) {
|
2076
|
-
$
|
2090
|
+
$paramName = $1;
|
2077
2091
|
$newVal = $2;
|
2078
|
-
$force = 1 if $
|
2092
|
+
$force = 1 if $paramName =~ s/\^$//;
|
2093
|
+
$paramName =~ tr/-_a-zA-Z0-9#//dc;
|
2094
|
+
$param = lc $paramName;
|
2079
2095
|
} else {
|
2080
|
-
$param = lc $newVal;
|
2096
|
+
($param = lc $newVal) =~ tr/-_a-zA-Z0-9#//dc;
|
2081
2097
|
undef $newVal;
|
2082
2098
|
}
|
2099
|
+
delete $$table{$param};
|
2083
2100
|
$oldVal = $$options{UserParam}{$param};
|
2084
2101
|
if (defined $newVal) {
|
2085
2102
|
if (length $newVal or $force) {
|
2086
2103
|
$$options{UserParam}{$param} = $newVal;
|
2104
|
+
AddTagToTable($table, $param, $paramName);
|
2087
2105
|
} else {
|
2088
2106
|
delete $$options{UserParam}{$param};
|
2089
2107
|
}
|
2090
2108
|
}
|
2109
|
+
# remove alternate version of tag
|
2110
|
+
$param .= '#' unless $param =~ s/#$//;
|
2111
|
+
delete $$table{$param};
|
2112
|
+
delete $$options{UserParam}{$param};
|
2091
2113
|
} elsif ($param eq 'RequestTags') {
|
2092
2114
|
if (defined $newVal) {
|
2093
2115
|
# parse list from delimited string if necessary
|
@@ -2244,7 +2266,7 @@ sub ClearOptions($)
|
|
2244
2266
|
TextOut => \*STDOUT,# file for Verbose/HtmlDump output
|
2245
2267
|
TimeZone => undef, # local time zone
|
2246
2268
|
Unknown => 0, # flag to get values of unknown tags (0-2)
|
2247
|
-
UserParam => { }, # user parameters for
|
2269
|
+
UserParam => { }, # user parameters for additional user-defined tag values
|
2248
2270
|
Validate => undef, # perform additional validation
|
2249
2271
|
Verbose => 0, # print verbose messages (0-5, higher # = more verbose)
|
2250
2272
|
WriteMode => 'wcg', # enable all write modes by default
|
@@ -2350,15 +2372,7 @@ sub ExtractInfo($;@)
|
|
2350
2372
|
unless ($filename eq '-') {
|
2351
2373
|
# extract file name from pipe if necessary
|
2352
2374
|
$realname =~ /\|$/ and $realname =~ s/^.*?"(.*?)".*/$1/s;
|
2353
|
-
my ($dir, $name);
|
2354
|
-
if (eval { require File::Basename }) {
|
2355
|
-
$dir = File::Basename::dirname($realname);
|
2356
|
-
$name = File::Basename::basename($realname);
|
2357
|
-
} else {
|
2358
|
-
($name = $realname) =~ tr/\\/\//;
|
2359
|
-
# remove path
|
2360
|
-
$dir = length($1) ? $1 : '/' if $name =~ s/(.*)\///;
|
2361
|
-
}
|
2375
|
+
my ($dir, $name) = SplitFileName($realname);
|
2362
2376
|
$self->FoundTag('FileName', $name);
|
2363
2377
|
$self->FoundTag('Directory', $dir) if defined $dir and length $dir;
|
2364
2378
|
if ($$req{filepath} or
|
@@ -2591,7 +2605,7 @@ sub ExtractInfo($;@)
|
|
2591
2605
|
if ($$self{OPTIONS}{FastScan}) {
|
2592
2606
|
$err = 'File header is all';
|
2593
2607
|
} else {
|
2594
|
-
my $num =
|
2608
|
+
my $num = 0;
|
2595
2609
|
for (;;) {
|
2596
2610
|
$raf->Read($buff, 65536) or undef($num), last;
|
2597
2611
|
$buff =~ /[^\Q$ch\E]/g and $num += pos($buff) - 1, last;
|
@@ -2679,6 +2693,15 @@ sub ExtractInfo($;@)
|
|
2679
2693
|
|
2680
2694
|
@startTime and $self->FoundTag('ProcessingTime', Time::HiRes::tv_interval(\@startTime));
|
2681
2695
|
|
2696
|
+
# add user-defined parameters that ended with '!'
|
2697
|
+
if (%{$$options{UserParam}}) {
|
2698
|
+
$self->VPrint(0, "UserParam tags:\n");
|
2699
|
+
my $table = GetTagTable('Image::ExifTool::UserParam');
|
2700
|
+
foreach (sort keys %{$$options{UserParam}}) {
|
2701
|
+
$self->HandleTag($table, $_, $$options{UserParam}{$_}) if /#$/;
|
2702
|
+
}
|
2703
|
+
}
|
2704
|
+
|
2682
2705
|
# restore original options
|
2683
2706
|
%saveOptions and $$self{OPTIONS} = \%saveOptions;
|
2684
2707
|
|
@@ -3854,6 +3877,25 @@ sub NextTagKey($$)
|
|
3854
3877
|
return undef;
|
3855
3878
|
}
|
3856
3879
|
|
3880
|
+
#------------------------------------------------------------------------------
|
3881
|
+
# Split file name into directory and name parts
|
3882
|
+
# Inptus: 0) file name
|
3883
|
+
# Returns: 0) directory, 1) filename
|
3884
|
+
sub SplitFileName($)
|
3885
|
+
{
|
3886
|
+
my $file = shift;
|
3887
|
+
my ($dir, $name);
|
3888
|
+
if (eval { require File::Basename }) {
|
3889
|
+
$dir = File::Basename::dirname($file);
|
3890
|
+
$name = File::Basename::basename($file);
|
3891
|
+
} else {
|
3892
|
+
($name = $file) =~ tr/\\/\//;
|
3893
|
+
# remove path
|
3894
|
+
$dir = length($1) ? $1 : '/' if $name =~ s/(.*)\///;
|
3895
|
+
}
|
3896
|
+
return ($dir, $name);
|
3897
|
+
}
|
3898
|
+
|
3857
3899
|
#------------------------------------------------------------------------------
|
3858
3900
|
# Encode file name for calls to system i/o routines
|
3859
3901
|
# Inputs: 0) ExifTool ref, 1) file name in CharSetFileName, 2) flag to force conversion
|
@@ -7629,7 +7671,7 @@ sub GetTagInfo($$$;$$$)
|
|
7629
7671
|
# Returns: tagInfo ref
|
7630
7672
|
# Notes: - will not override existing entry in table
|
7631
7673
|
# - info need contain no entries when this routine is called
|
7632
|
-
# - tag name is
|
7674
|
+
# - tag name is cleaned if necessary
|
7633
7675
|
sub AddTagToTable($$;$$)
|
7634
7676
|
{
|
7635
7677
|
my ($tagTablePtr, $tagID, $tagInfo, $noPrefix) = @_;
|
data/bin/lib/Image/ExifTool.pod
CHANGED
@@ -468,6 +468,7 @@ below, case is not significant:
|
|
468
468
|
Thai cp874 Windows Thai
|
469
469
|
DOSLatinUS cp437 DOS Latin US
|
470
470
|
DOSLatin1 cp850 DOS Latin1
|
471
|
+
DOSCyrillic cp866 DOS Cyrillic
|
471
472
|
MacRoman cp10000, Roman Macintosh Roman
|
472
473
|
MacLatin2 cp10029 Macintosh Latin2 (Central Europe)
|
473
474
|
MacCyrillic cp10007 Macintosh Cyrillic
|
@@ -971,9 +972,11 @@ Where I<PARAM> is the user-defined parameter name (case insensitive).
|
|
971
972
|
|
972
973
|
User-defined parameters may be accessed in tag name expressions by prefixing
|
973
974
|
the parameter name with a dollar sign just like normal tags, or via the API
|
974
|
-
by calling C<Options('UserParam','PARAM')>.
|
975
|
-
|
976
|
-
|
975
|
+
by calling C<Options('UserParam','PARAM')>. Appending a hash tag (C<#>) to
|
976
|
+
the parameter name also causes the parameter to be extracted as a normal tag
|
977
|
+
(in the UserParam group). If called without additional arguments,
|
978
|
+
C<Options('UserParam')> returns a reference to the hash of all user
|
979
|
+
parameters (with lower-case names).
|
977
980
|
|
978
981
|
=item Validate
|
979
982
|
|
@@ -2590,7 +2593,7 @@ character references are converted. When writing, ExifTool always encodes
|
|
2590
2593
|
XMP as UTF-8, converting the following 5 characters to XML character
|
2591
2594
|
references: E<amp> E<lt> E<gt> E<39> E<quot>. By default no further
|
2592
2595
|
conversion is performed, however if the L</Charset> option is other than
|
2593
|
-
'UTF8' then text is converted to/from
|
2596
|
+
'UTF8' then text is converted to/from the specified character set when
|
2594
2597
|
reading/writing.
|
2595
2598
|
|
2596
2599
|
=head2 PNG
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
88
88
|
sub ProcessExifInfo($$$);
|
89
89
|
sub SwapWords($);
|
90
90
|
|
91
|
-
$VERSION = '4.
|
91
|
+
$VERSION = '4.36';
|
92
92
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
@@ -6676,6 +6676,24 @@ my %ciMaxFocal = (
|
|
6676
6676
|
Name => 'FlashExposureLock',
|
6677
6677
|
PrintConv => \%offOn,
|
6678
6678
|
},
|
6679
|
+
0x3d => { #IB
|
6680
|
+
Name => 'RFLensType',
|
6681
|
+
Format => 'int16u',
|
6682
|
+
PrintConv => {
|
6683
|
+
0 => 'n/a',
|
6684
|
+
257 => 'Canon RF 50mm F1.2L USM',
|
6685
|
+
258 => 'Canon RF 24-105mm F4L IS USM',
|
6686
|
+
259 => 'Canon RF 28-70mm F2L USM',
|
6687
|
+
260 => 'Canon RF 35mm F1.8 MACRO IS STM',
|
6688
|
+
261 => 'Canon RF 85mm F1.2L USM',
|
6689
|
+
262 => 'Canon RF 85mm F1.2L USM DS',
|
6690
|
+
263 => 'Canon RF 24-70mm F2.8L IS USM',
|
6691
|
+
264 => 'Canon RF 15-35mm F2.8L IS USM',
|
6692
|
+
265 => 'Canon RF 24-240mm F4-6.3 IS USM',
|
6693
|
+
266 => 'Canon RF 70-200mm F2.8L IS USM',
|
6694
|
+
274 => 'Canon RF 24-105mm F4-7.1 IS STM',
|
6695
|
+
},
|
6696
|
+
},
|
6679
6697
|
);
|
6680
6698
|
|
6681
6699
|
# Internal serial number information (MakerNotes tag 0x96) (ref PH)
|
@@ -59,6 +59,7 @@ my %unicode2byte = (
|
|
59
59
|
Latin2 => 0x101,
|
60
60
|
DOSLatinUS => 0x101,
|
61
61
|
DOSLatin1 => 0x101,
|
62
|
+
DOSCyrillic => 0x101,
|
62
63
|
MacCroatian => 0x101,
|
63
64
|
MacCyrillic => 0x101,
|
64
65
|
MacGreek => 0x101,
|
@@ -407,11 +408,11 @@ This module contains routines used by ExifTool to translate special
|
|
407
408
|
character sets. Currently, the following character sets are supported:
|
408
409
|
|
409
410
|
UTF8, UTF16, UCS2, UCS4, Arabic, Baltic, Cyrillic, Greek, Hebrew, JIS,
|
410
|
-
Latin, Latin2, DOSLatinUS, DOSLatin1,
|
411
|
-
MacChineseTW, MacCroatian, MacCyrillic, MacGreek, MacHebrew,
|
412
|
-
MacJapanese, MacKorean, MacLatin2, MacRSymbol, MacRoman,
|
413
|
-
MacThai, MacTurkish, PDFDoc, RSymbol, ShiftJIS, Symbol, Thai,
|
414
|
-
Vietnam
|
411
|
+
Latin, Latin2, DOSLatinUS, DOSLatin1, DOSCyrillic, MacArabic,
|
412
|
+
MacChineseCN, MacChineseTW, MacCroatian, MacCyrillic, MacGreek, MacHebrew,
|
413
|
+
MacIceland, MacJapanese, MacKorean, MacLatin2, MacRSymbol, MacRoman,
|
414
|
+
MacRomanian, MacThai, MacTurkish, PDFDoc, RSymbol, ShiftJIS, Symbol, Thai,
|
415
|
+
Turkish, Vietnam
|
415
416
|
|
416
417
|
However, only some of these character sets are available to the user via
|
417
418
|
ExifTool options -- the multi-byte character sets are used only internally
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# File: DOSCyrillic.pm
|
3
|
+
#
|
4
|
+
# Description: cp866 to Unicode
|
5
|
+
#
|
6
|
+
# Revisions: 2020/03/23 - P. Harvey created
|
7
|
+
#
|
8
|
+
# References: 1) https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP866.TXT
|
9
|
+
#
|
10
|
+
# Notes: The table omits 1-byte characters with the same values as Unicode
|
11
|
+
#------------------------------------------------------------------------------
|
12
|
+
use strict;
|
13
|
+
|
14
|
+
%Image::ExifTool::Charset::DOSCyrillic = (
|
15
|
+
0x80 => 0x0410, 0x81 => 0x0411, 0x82 => 0x0412, 0x83 => 0x0413,
|
16
|
+
0x84 => 0x0414, 0x85 => 0x0415, 0x86 => 0x0416, 0x87 => 0x0417,
|
17
|
+
0x88 => 0x0418, 0x89 => 0x0419, 0x8a => 0x041a, 0x8b => 0x041b,
|
18
|
+
0x8c => 0x041c, 0x8d => 0x041d, 0x8e => 0x041e, 0x8f => 0x041f,
|
19
|
+
0x90 => 0x0420, 0x91 => 0x0421, 0x92 => 0x0422, 0x93 => 0x0423,
|
20
|
+
0x94 => 0x0424, 0x95 => 0x0425, 0x96 => 0x0426, 0x97 => 0x0427,
|
21
|
+
0x98 => 0x0428, 0x99 => 0x0429, 0x9a => 0x042a, 0x9b => 0x042b,
|
22
|
+
0x9c => 0x042c, 0x9d => 0x042d, 0x9e => 0x042e, 0x9f => 0x042f,
|
23
|
+
0xa0 => 0x0430, 0xa1 => 0x0431, 0xa2 => 0x0432, 0xa3 => 0x0433,
|
24
|
+
0xa4 => 0x0434, 0xa5 => 0x0435, 0xa6 => 0x0436, 0xa7 => 0x0437,
|
25
|
+
0xa8 => 0x0438, 0xa9 => 0x0439, 0xaa => 0x043a, 0xab => 0x043b,
|
26
|
+
0xac => 0x043c, 0xad => 0x043d, 0xae => 0x043e, 0xaf => 0x043f,
|
27
|
+
0xb0 => 0x2591, 0xb1 => 0x2592, 0xb2 => 0x2593, 0xb3 => 0x2502,
|
28
|
+
0xb4 => 0x2524, 0xb5 => 0x2561, 0xb6 => 0x2562, 0xb7 => 0x2556,
|
29
|
+
0xb8 => 0x2555, 0xb9 => 0x2563, 0xba => 0x2551, 0xbb => 0x2557,
|
30
|
+
0xbc => 0x255d, 0xbd => 0x255c, 0xbe => 0x255b, 0xbf => 0x2510,
|
31
|
+
0xc0 => 0x2514, 0xc1 => 0x2534, 0xc2 => 0x252c, 0xc3 => 0x251c,
|
32
|
+
0xc4 => 0x2500, 0xc5 => 0x253c, 0xc6 => 0x255e, 0xc7 => 0x255f,
|
33
|
+
0xc8 => 0x255a, 0xc9 => 0x2554, 0xca => 0x2569, 0xcb => 0x2566,
|
34
|
+
0xcc => 0x2560, 0xcd => 0x2550, 0xce => 0x256c, 0xcf => 0x2567,
|
35
|
+
0xd0 => 0x2568, 0xd1 => 0x2564, 0xd2 => 0x2565, 0xd3 => 0x2559,
|
36
|
+
0xd4 => 0x2558, 0xd5 => 0x2552, 0xd6 => 0x2553, 0xd7 => 0x256b,
|
37
|
+
0xd8 => 0x256a, 0xd9 => 0x2518, 0xda => 0x250c, 0xdb => 0x2588,
|
38
|
+
0xdc => 0x2584, 0xdd => 0x258c, 0xde => 0x2590, 0xdf => 0x2580,
|
39
|
+
0xe0 => 0x0440, 0xe1 => 0x0441, 0xe2 => 0x0442, 0xe3 => 0x0443,
|
40
|
+
0xe4 => 0x0444, 0xe5 => 0x0445, 0xe6 => 0x0446, 0xe7 => 0x0447,
|
41
|
+
0xe8 => 0x0448, 0xe9 => 0x0449, 0xea => 0x044a, 0xeb => 0x044b,
|
42
|
+
0xec => 0x044c, 0xed => 0x044d, 0xee => 0x044e, 0xef => 0x044f,
|
43
|
+
0xf0 => 0x0401, 0xf1 => 0x0451, 0xf2 => 0x0404, 0xf3 => 0x0454,
|
44
|
+
0xf4 => 0x0407, 0xf5 => 0x0457, 0xf6 => 0x040e, 0xf7 => 0x045e,
|
45
|
+
0xf8 => 0x00b0, 0xf9 => 0x2219, 0xfa => 0x00b7, 0xfb => 0x221a,
|
46
|
+
0xfc => 0x2116, 0xfd => 0x00a4, 0xfe => 0x25a0, 0xff => 0x00a0,
|
47
|
+
);
|
48
|
+
|
49
|
+
1; # end
|
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
56
56
|
use Image::ExifTool qw(:DataAccess :Utils);
|
57
57
|
use Image::ExifTool::MakerNotes;
|
58
58
|
|
59
|
-
$VERSION = '4.
|
59
|
+
$VERSION = '4.30';
|
60
60
|
|
61
61
|
sub ProcessExif($$$);
|
62
62
|
sub WriteExif($$$);
|
@@ -4728,6 +4728,7 @@ my %subSecConv = (
|
|
4728
4728
|
9 => 'LensType2',
|
4729
4729
|
10 => 'LensType3',
|
4730
4730
|
11 => 'LensFocalLength', # (for Pentax to check for converter)
|
4731
|
+
12 => 'RFLensType',
|
4731
4732
|
},
|
4732
4733
|
Notes => q{
|
4733
4734
|
attempt to identify the actual lens from all lenses with a given LensType.
|
@@ -4756,6 +4757,12 @@ my %subSecConv = (
|
|
4756
4757
|
}
|
4757
4758
|
$pcv = $$self{TAG_INFO}{LensType2}{PrintConv};
|
4758
4759
|
}
|
4760
|
+
# use Canon RFLensType if available
|
4761
|
+
if ($val[12]) {
|
4762
|
+
$val[0] = $val[12];
|
4763
|
+
$prt[0] = $prt[12];
|
4764
|
+
$pcv = $$self{TAG_INFO}{RFLensType}{PrintConv};
|
4765
|
+
}
|
4759
4766
|
my $lens = Image::ExifTool::Exif::PrintLensID($self, $prt[0], $pcv, $prt[8], @val);
|
4760
4767
|
# check for use of lens converter (Pentax K-3)
|
4761
4768
|
if ($val[11] and $val[1] and $lens) {
|
@@ -6163,6 +6170,9 @@ sub ProcessExif($$$)
|
|
6163
6170
|
$tip .= sprintf("Offset base: ${sign}0x%.4x\n", abs($actPt - $offPt));
|
6164
6171
|
$style = 'F' if $style eq 'H'; # purple for different offsets
|
6165
6172
|
}
|
6173
|
+
if ($$et{EXIF_POS} and not $$et{BASE_FUDGE}) {
|
6174
|
+
$tip .= sprintf("File offset: 0x%.4x\n", $actPt + $$et{EXIF_POS})
|
6175
|
+
}
|
6166
6176
|
$colName = "<span class=$style>$tagName</span>";
|
6167
6177
|
$colName .= ' <span class=V>(odd)</span>' if $offPt & 0x01;
|
6168
6178
|
} else {
|
@@ -97,7 +97,8 @@ var YTOP = 20; // y offset when above cursor
|
|
97
97
|
var safari1 = navigator.userAgent.indexOf("Safari/312.6") >= 0;
|
98
98
|
var ie6 = navigator.userAgent.toLowerCase().indexOf('msie 6') >= 0;
|
99
99
|
var mspan = new Array;
|
100
|
-
var
|
100
|
+
var clicked = 0;
|
101
|
+
var hlist, tt, tb, firstOutEvt, lastInEvt;
|
101
102
|
|
102
103
|
function GetElementsByClass(classname, tagname) {
|
103
104
|
var found = new Array();
|
@@ -115,6 +116,18 @@ function GetElementsByClass(classname, tagname) {
|
|
115
116
|
return found;
|
116
117
|
}
|
117
118
|
|
119
|
+
// click mouse
|
120
|
+
function doClick(e)
|
121
|
+
{
|
122
|
+
clicked ^= 1;
|
123
|
+
if (clicked) {
|
124
|
+
firstOutEvt = lastInEvt = undefined;
|
125
|
+
} else {
|
126
|
+
if (firstOutEvt) high(firstOutEvt, 0);
|
127
|
+
if (lastInEvt) high(lastInEvt, 1);
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
118
131
|
// move tooltip
|
119
132
|
function move(e)
|
120
133
|
{
|
@@ -162,6 +175,12 @@ function move(e)
|
|
162
175
|
|
163
176
|
// highlight/unhighlight text
|
164
177
|
function high(e,on) {
|
178
|
+
if (on) {
|
179
|
+
lastInEvt = e;
|
180
|
+
} else {
|
181
|
+
if (!firstOutEvt) firstOutEvt = e;
|
182
|
+
}
|
183
|
+
if (clicked) return;
|
165
184
|
var targ;
|
166
185
|
if (e.target) targ = e.target;
|
167
186
|
else if (e.srcElement) targ = e.srcElement;
|
@@ -226,7 +245,7 @@ Enable JavaScript for active highlighting and information tool tips!
|
|
226
245
|
<table class=dump cellspacing=0 cellpadding=2>
|
227
246
|
<tr><td valign='top'><pre>];
|
228
247
|
|
229
|
-
my $preMouse = q(<pre onmouseover="high(event,1)" onmouseout="high(event,0)" onmousemove="move(event)">);
|
248
|
+
my $preMouse = q(<pre onmouseover="high(event,1)" onmouseout="high(event,0)" onmousemove="move(event)" onmousedown="doClick(event)">);
|
230
249
|
|
231
250
|
#------------------------------------------------------------------------------
|
232
251
|
# New - create new HtmlDump object
|
@@ -5056,6 +5056,7 @@ my %tagLookup = (
|
|
5056
5056
|
'reverseshutterspeedaperture' => { 273 => '5.3' },
|
5057
5057
|
'revision' => { 466 => 'revision' },
|
5058
5058
|
'rflensmffocusringsensitivity' => { 81 => 0x714 },
|
5059
|
+
'rflenstype' => { 55 => 0x3d },
|
5059
5060
|
'rgbcurvelimits' => { 105 => 0x238 },
|
5060
5061
|
'rgbcurvepoints' => { 104 => 0x7, 105 => 0x20e },
|
5061
5062
|
'richtextcomment' => { 471 => 'RichTextComment' },
|
@@ -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 23358 tags, with 15305 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
|
@@ -6895,6 +6895,7 @@ WB tags for the Canon G9.
|
|
6895
6895
|
20 FocusDistanceUpper int16u
|
6896
6896
|
21 FocusDistanceLower int16u
|
6897
6897
|
25 FlashExposureLock int16s
|
6898
|
+
61 RFLensType int16u
|
6898
6899
|
|
6899
6900
|
=head3 Canon SerialInfo Tags
|
6900
6901
|
|
@@ -34380,6 +34381,7 @@ values, may created via the ExifTool configuration file.
|
|
34380
34381
|
LensType2
|
34381
34382
|
LensType3
|
34382
34383
|
LensFocalLength
|
34384
|
+
RFLensType
|
34383
34385
|
LensID Nikon:LensIDNumber no
|
34384
34386
|
LensFStops
|
34385
34387
|
MinFocalLength
|
@@ -457,94 +457,98 @@ sub WriteItemInfo($$$)
|
|
457
457
|
return () unless $items and $raf;
|
458
458
|
|
459
459
|
# extract information from EXIF/XMP metadata items
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
}
|
493
|
-
push @edit, [ $pos, $pos + $$extent[2] ]; # replace or delete this if changed
|
460
|
+
my $primary = $$et{PrimaryItem};
|
461
|
+
my $curPos = $raf->Tell();
|
462
|
+
my $id;
|
463
|
+
foreach $id (sort { $a <=> $b } keys %$items) {
|
464
|
+
$primary = $id unless defined $primary; # assume primary is lowest-number item if pitm missing
|
465
|
+
my $item = $$items{$id};
|
466
|
+
# only edit primary EXIF/XMP metadata
|
467
|
+
next unless $$item{RefersTo} and $$item{RefersTo}{$primary};
|
468
|
+
my $type = $$item{ContentType} || $$item{Type} || next;
|
469
|
+
# get ExifTool name for this item
|
470
|
+
$name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type};
|
471
|
+
next unless $name; # only care about EXIF and XMP
|
472
|
+
next unless $$et{EDIT_DIRS}{$name};
|
473
|
+
$did{$name} = 1; # set flag to prevent creating this metadata
|
474
|
+
my ($warn, $extent, $buff, @edit);
|
475
|
+
$warn = 'Missing iloc box' unless $$boxPos{iloc};
|
476
|
+
$warn = "No Extents for $type item" unless $$item{Extents} and @{$$item{Extents}};
|
477
|
+
$warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding};
|
478
|
+
$warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
|
479
|
+
$warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod};
|
480
|
+
$warn = "$type metadata is not this file" if $$item{DataReferenceIndex};
|
481
|
+
$warn and $et->Warn($warn), next;
|
482
|
+
my $base = $$item{BaseOffset} || 0;
|
483
|
+
my $val = '';
|
484
|
+
foreach $extent (@{$$item{Extents}}) {
|
485
|
+
$val .= $buff if defined $buff;
|
486
|
+
my $pos = $$extent[1] + $base;
|
487
|
+
if ($$extent[2]) {
|
488
|
+
$raf->Seek($pos, 0) or last;
|
489
|
+
$raf->Read($buff, $$extent[2]) or last;
|
490
|
+
} else {
|
491
|
+
$buff = '';
|
494
492
|
}
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
493
|
+
push @edit, [ $pos, $pos + $$extent[2] ]; # replace or delete this if changed
|
494
|
+
}
|
495
|
+
next unless defined $buff;
|
496
|
+
$buff = $val . $buff if length $val;
|
497
|
+
my ($hdr, $subTable, $proc);
|
498
|
+
if ($name eq 'EXIF') {
|
499
|
+
if (not length $buff) {
|
500
|
+
# create EXIF from scratch
|
501
|
+
$hdr = "\0\0\0\x06Exif\0\0";
|
502
|
+
} elsif (length($buff) >= 4 and length($buff) >= 4 + unpack('N',$buff)) {
|
503
503
|
$hdr = substr($buff, 0, 4 + unpack('N',$buff));
|
504
|
-
$subTable = GetTagTable('Image::ExifTool::Exif::Main');
|
505
|
-
$proc = \&Image::ExifTool::WriteTIFF;
|
506
504
|
} else {
|
507
|
-
$
|
508
|
-
|
505
|
+
$et->Warn('Invalid Exif header');
|
506
|
+
next;
|
509
507
|
}
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
}
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
$et->Error("Can't yet
|
508
|
+
$subTable = GetTagTable('Image::ExifTool::Exif::Main');
|
509
|
+
$proc = \&Image::ExifTool::WriteTIFF;
|
510
|
+
} else {
|
511
|
+
$hdr = '';
|
512
|
+
$subTable = GetTagTable('Image::ExifTool::XMP::Main');
|
513
|
+
}
|
514
|
+
my %dirInfo = (
|
515
|
+
DataPt => \$buff,
|
516
|
+
DataLen => length $buff,
|
517
|
+
DirStart => length $hdr,
|
518
|
+
DirLen => length($buff) - length $hdr,
|
519
|
+
);
|
520
|
+
my $changed = $$et{CHANGED};
|
521
|
+
my $newVal = $et->WriteDirectory(\%dirInfo, $subTable, $proc);
|
522
|
+
if (defined $newVal and $changed ne $$et{CHANGED} and
|
523
|
+
# nothing changed if deleting an empty directory
|
524
|
+
($dirInfo{DirLen} or length $newVal))
|
525
|
+
{
|
526
|
+
$newVal = $hdr . $newVal if length $hdr and length $newVal;
|
527
|
+
$edit[0][2] = \$newVal; # replace the old chunk with the new data
|
528
|
+
$edit[0][3] = $id; # mark this chunk with the item ID
|
529
|
+
push @mdatEdit, @edit;
|
530
|
+
# update item extent_length
|
531
|
+
my $n = length $newVal;
|
532
|
+
foreach $extent (@{$$item{Extents}}) {
|
533
|
+
my ($nlen, $lenPt) = @$extent[3,4];
|
534
|
+
if ($nlen == 8) {
|
535
|
+
Set64u($n, $outfile, $$boxPos{iloc}[0] + 8 + $lenPt);
|
536
|
+
} elsif ($n <= 0xffffffff) {
|
537
|
+
Set32u($n, $outfile, $$boxPos{iloc}[0] + 8 + $lenPt);
|
538
|
+
} else {
|
539
|
+
$et->Error("Can't yet promote iloc length to 64 bits");
|
540
|
+
return ();
|
542
541
|
}
|
542
|
+
$n = 0;
|
543
|
+
}
|
544
|
+
if (@{$$item{Extents}} != 1) {
|
545
|
+
$et->Error("Can't yet handle $name in multiple parts. Please submit sample for testing");
|
543
546
|
}
|
544
|
-
$$et{CHANGED} = $changed; # (will set this later if successful in editing mdat)
|
545
547
|
}
|
546
|
-
$
|
548
|
+
$$et{CHANGED} = $changed; # (will set this later if successful in editing mdat)
|
547
549
|
}
|
550
|
+
$raf->Seek($curPos, 0); # seek back to original position
|
551
|
+
|
548
552
|
# add necessary metadata types if they didn't already exist
|
549
553
|
my ($countNew, %add, %usedID);
|
550
554
|
foreach $name ('EXIF','XMP') {
|
@@ -556,10 +560,18 @@ sub WriteItemInfo($$$)
|
|
556
560
|
$et->Warn("Can't create $name. Missing expected $str");
|
557
561
|
last;
|
558
562
|
}
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
+
unless (defined $$et{PrimaryItem}) {
|
564
|
+
unless (defined $primary) {
|
565
|
+
$et->Warn("Can't create $name. No items to reference");
|
566
|
+
last;
|
567
|
+
}
|
568
|
+
# add new primary item reference box after hdrl box
|
569
|
+
if ($primary < 0x10000) {
|
570
|
+
$add{hdlr} = pack('Na4Nn', 14, 'pitm', 0, $primary);
|
571
|
+
} else {
|
572
|
+
$add{hdlr} = pack('Na4CCCCN', 16, 'pitm', 1, 0, 0, 0, $primary);
|
573
|
+
}
|
574
|
+
$et->Warn("Added missing PrimaryItemReference (for item $primary)", 1);
|
563
575
|
}
|
564
576
|
my $buff = '';
|
565
577
|
my ($hdr, $subTable, $proc);
|
@@ -585,7 +597,7 @@ sub WriteItemInfo($$$)
|
|
585
597
|
$irefVer = Get8u($outfile, $$boxPos{iref}[0] + 8);
|
586
598
|
} else {
|
587
599
|
# create iref box after end of iinf box (and save version in boxPos list)
|
588
|
-
$irefVer = ($primary
|
600
|
+
$irefVer = ($primary < 0x10000 ? 0 : 1);
|
589
601
|
$$boxPos{iref} = [ $$boxPos{iinf}[0] + $$boxPos{iinf}[1], 0, $irefVer ];
|
590
602
|
}
|
591
603
|
$newVal = $hdr . $newVal if length $hdr;
|
@@ -672,7 +684,8 @@ sub WriteItemInfo($$$)
|
|
672
684
|
}
|
673
685
|
}
|
674
686
|
if ($countNew) {
|
675
|
-
# insert new entries into iinf, iref and iloc boxes
|
687
|
+
# insert new entries into iinf, iref and iloc boxes,
|
688
|
+
# and add new pitm box after hdlr if necessary
|
676
689
|
my $added = 0;
|
677
690
|
my $tag;
|
678
691
|
foreach $tag (sort { $$boxPos{$a}[0] <=> $$boxPos{$b}[0] } keys %$boxPos) {
|
@@ -683,7 +696,7 @@ sub WriteItemInfo($$$)
|
|
683
696
|
# create new iref box
|
684
697
|
$add{$tag} = Set32u(12 + length $add{$tag}) . $tag .
|
685
698
|
Set8u($$boxPos{$tag}[2]) . "\0\0\0" . $add{$tag};
|
686
|
-
}
|
699
|
+
} elsif ($tag ne 'hdlr') {
|
687
700
|
my $n = Get32u($outfile, $pos);
|
688
701
|
Set32u($n + length($add{$tag}), $outfile, $pos); # increase box size
|
689
702
|
}
|
@@ -711,10 +724,10 @@ sub WriteItemInfo($$$)
|
|
711
724
|
if ($added) {
|
712
725
|
$$_[1] += $added foreach @{$$dirInfo{ChunkOffset}};
|
713
726
|
}
|
714
|
-
}
|
727
|
+
} elsif ($tag ne 'hdlr') {
|
715
728
|
next;
|
716
729
|
}
|
717
|
-
# add new entries to this box
|
730
|
+
# add new entries to this box (or add pitm after hdlr)
|
718
731
|
substr($$outfile, $pos + $$boxPos{$tag}[1], 0) = $add{$tag};
|
719
732
|
$added += length $add{$tag}; # positions are shifted by length of new entries
|
720
733
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 11.
|
4
|
+
version: 11.93.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-03
|
12
|
+
date: 2020-04-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|
@@ -201,6 +201,7 @@ files:
|
|
201
201
|
- bin/config_files/nksc.config
|
202
202
|
- bin/config_files/photoshop_paths.config
|
203
203
|
- bin/config_files/picasa_faces.config
|
204
|
+
- bin/config_files/pix4d.config
|
204
205
|
- bin/config_files/rotate_regions.config
|
205
206
|
- bin/config_files/tiff_version.config
|
206
207
|
- bin/config_files/time_zone.config
|
@@ -236,6 +237,7 @@ files:
|
|
236
237
|
- bin/lib/Image/ExifTool/Charset/Arabic.pm
|
237
238
|
- bin/lib/Image/ExifTool/Charset/Baltic.pm
|
238
239
|
- bin/lib/Image/ExifTool/Charset/Cyrillic.pm
|
240
|
+
- bin/lib/Image/ExifTool/Charset/DOSCyrillic.pm
|
239
241
|
- bin/lib/Image/ExifTool/Charset/DOSLatin1.pm
|
240
242
|
- bin/lib/Image/ExifTool/Charset/DOSLatinUS.pm
|
241
243
|
- bin/lib/Image/ExifTool/Charset/Greek.pm
|