exiftool-vendored.pl 12.62.0 → 12.67.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.
- package/bin/Changes +96 -1
- package/bin/MANIFEST +4 -0
- package/bin/META.json +5 -3
- package/bin/META.yml +5 -3
- package/bin/Makefile.PL +7 -1
- package/bin/README +50 -46
- package/bin/config_files/guano.config +161 -0
- package/bin/exiftool +116 -79
- package/bin/lib/Image/ExifTool/7Z.pm +793 -0
- package/bin/lib/Image/ExifTool/Apple.pm +19 -8
- package/bin/lib/Image/ExifTool/BigTIFF.pm +8 -1
- package/bin/lib/Image/ExifTool/Canon.pm +33 -12
- package/bin/lib/Image/ExifTool/CanonRaw.pm +4 -4
- package/bin/lib/Image/ExifTool/CanonVRD.pm +4 -1
- package/bin/lib/Image/ExifTool/Exif.pm +31 -14
- package/bin/lib/Image/ExifTool/FlashPix.pm +8 -2
- package/bin/lib/Image/ExifTool/FujiFilm.pm +6 -3
- package/bin/lib/Image/ExifTool/GPS.pm +5 -2
- package/bin/lib/Image/ExifTool/Geotag.pm +5 -2
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +226 -28
- package/bin/lib/Image/ExifTool/Lang/fr.pm +1467 -202
- package/bin/lib/Image/ExifTool/MPF.pm +2 -1
- package/bin/lib/Image/ExifTool/Matroska.pm +16 -1
- package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- package/bin/lib/Image/ExifTool/Nikon.pm +948 -31
- package/bin/lib/Image/ExifTool/NikonCustom.pm +874 -63
- package/bin/lib/Image/ExifTool/PDF.pm +23 -5
- package/bin/lib/Image/ExifTool/PLIST.pm +8 -1
- package/bin/lib/Image/ExifTool/PLUS.pm +19 -4
- package/bin/lib/Image/ExifTool/PNG.pm +6 -6
- package/bin/lib/Image/ExifTool/Pentax.pm +3 -1
- package/bin/lib/Image/ExifTool/PhaseOne.pm +5 -5
- package/bin/lib/Image/ExifTool/QuickTime.pm +91 -30
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -19
- package/bin/lib/Image/ExifTool/README +2 -2
- package/bin/lib/Image/ExifTool/RIFF.pm +11 -9
- package/bin/lib/Image/ExifTool/Samsung.pm +227 -227
- package/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +4 -4
- package/bin/lib/Image/ExifTool/Sony.pm +229 -30
- package/bin/lib/Image/ExifTool/TagLookup.pm +4758 -4633
- package/bin/lib/Image/ExifTool/TagNames.pod +715 -23
- package/bin/lib/Image/ExifTool/Validate.pm +17 -1
- package/bin/lib/Image/ExifTool/WriteExif.pl +9 -7
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +21 -9
- package/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
- package/bin/lib/Image/ExifTool/Writer.pl +36 -12
- package/bin/lib/Image/ExifTool/XMP.pm +14 -2
- package/bin/lib/Image/ExifTool/XMP2.pl +33 -1
- package/bin/lib/Image/ExifTool/XMPStruct.pl +96 -28
- package/bin/lib/Image/ExifTool/ZIP.pm +5 -5
- package/bin/lib/Image/ExifTool.pm +184 -132
- package/bin/lib/Image/ExifTool.pod +124 -58
- package/bin/perl-Image-ExifTool.spec +44 -44
- package/bin/pp_build_exe.args +7 -4
- package/package.json +3 -3
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
|
16
16
|
use Image::ExifTool::Exif;
|
|
17
17
|
use Image::ExifTool::PLIST;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.11';
|
|
20
20
|
|
|
21
21
|
sub ConvertPLIST($$);
|
|
22
22
|
|
|
@@ -110,24 +110,32 @@ sub ConvertPLIST($$);
|
|
|
110
110
|
},
|
|
111
111
|
# 0x0010 - int32s: 1 (SphereStatus, ref 2)
|
|
112
112
|
0x0011 => { # (if defined, there is a live photo associated with the video, #forum13565) (AssetIdentifier, ref 2)
|
|
113
|
-
Name => '
|
|
114
|
-
|
|
113
|
+
Name => 'ContentIdentifier',
|
|
114
|
+
Notes => 'called MediaGroupUUID when it appears as an XAttr',
|
|
115
|
+
# - originally called ContentIdentifier, forum8750
|
|
116
|
+
# - changed in 12.19 to MediaGroupUUID, NealKrawetz private communication
|
|
117
|
+
# - changed back to ContentIdentifier since Apple writes this to Keys content.identifier (forum14874)
|
|
115
118
|
Writable => 'string',
|
|
119
|
+
|
|
116
120
|
},
|
|
117
121
|
# 0x0012 - (QRMOutputType, ref 2)
|
|
118
122
|
# 0x0013 - (SphereExternalForceOffset, ref 2)
|
|
119
123
|
0x0014 => { # (StillImageCaptureType, ref 2)
|
|
120
124
|
Name => 'ImageCaptureType',
|
|
121
125
|
Writable => 'int32s',
|
|
122
|
-
Unknown => 1, # (don't know what the values mean)
|
|
123
126
|
# seen: 1,2,3,4,5,10,12
|
|
127
|
+
PrintConv => { #forum15096
|
|
128
|
+
1 => 'ProRAW',
|
|
129
|
+
2 => 'Portrait',
|
|
130
|
+
10 => 'Photo',
|
|
131
|
+
},
|
|
124
132
|
},
|
|
125
133
|
0x0015 => { # (ImageGroupIdentifier, ref 2)
|
|
126
134
|
Name => 'ImageUniqueID',
|
|
127
135
|
Writable => 'string',
|
|
128
136
|
},
|
|
129
137
|
# 0x0016 - string[29]: "AXZ6pMTOh2L+acSh4Kg630XCScoO\0" (PhotosOriginatingSignature, ref 2)
|
|
130
|
-
0x0017 => { #forum13565 (only valid if MediaGroupUUID exists) (StillImageCaptureFlags, ref 2)
|
|
138
|
+
0x0017 => { #forum13565 (only valid if MediaGroupUUID/ContentIdentifier exists) (StillImageCaptureFlags, ref 2)
|
|
131
139
|
Name => 'LivePhotoVideoIndex',
|
|
132
140
|
Notes => 'divide by RunTimeScale to get time in seconds',
|
|
133
141
|
},
|
|
@@ -153,7 +161,7 @@ sub ConvertPLIST($$);
|
|
|
153
161
|
# 0x001e - (OriginatingAppID, ref 2)
|
|
154
162
|
# 0x001f - int32s: 0,1 (PhotosAppFeatureFlags, ref 2)
|
|
155
163
|
0x0020 => { # (ImageCaptureRequestIdentifier, ref 2)
|
|
156
|
-
Name => '
|
|
164
|
+
Name => 'ImageCaptureRequestID',
|
|
157
165
|
Writable => 'string',
|
|
158
166
|
Unknown => 1,
|
|
159
167
|
},
|
|
@@ -182,7 +190,10 @@ sub ConvertPLIST($$);
|
|
|
182
190
|
# 0x0028 - int32s (UBMethod, ref 2)
|
|
183
191
|
# 0x0029 - string (SpatialOverCaptureGroupIdentifier, ref 2)
|
|
184
192
|
# 0x002A - (iCloudServerSoftwareVersionForDynamicallyGeneratedMedia, ref 2)
|
|
185
|
-
|
|
193
|
+
0x002b => {
|
|
194
|
+
Name => 'PhotoIdentifier', #2
|
|
195
|
+
Writable => 'string',
|
|
196
|
+
},
|
|
186
197
|
# 0x002C - (SpatialOverCaptureImageType, ref 2)
|
|
187
198
|
# 0x002D - (CCT, ref 2)
|
|
188
199
|
# 0x002E - (ApsMode, ref 2)
|
|
@@ -308,7 +319,7 @@ sub ConvertPLIST($$)
|
|
|
308
319
|
$val = $$dirInfo{Value};
|
|
309
320
|
if (ref $val eq 'HASH' and not $et->Options('Struct')) {
|
|
310
321
|
require 'Image/ExifTool/XMPStruct.pl';
|
|
311
|
-
$val = Image::ExifTool::XMP::SerializeStruct($val);
|
|
322
|
+
$val = Image::ExifTool::XMP::SerializeStruct($et, $val);
|
|
312
323
|
}
|
|
313
324
|
return $val;
|
|
314
325
|
}
|
|
@@ -15,7 +15,7 @@ use vars qw($VERSION);
|
|
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
16
16
|
use Image::ExifTool::Exif;
|
|
17
17
|
|
|
18
|
-
$VERSION = '1.
|
|
18
|
+
$VERSION = '1.08';
|
|
19
19
|
|
|
20
20
|
my $maxOffset = 0x7fffffff; # currently supported maximum data offset/size
|
|
21
21
|
|
|
@@ -216,6 +216,13 @@ sub ProcessBigIFD($$$)
|
|
|
216
216
|
$dirStart = Image::ExifTool::Get64u(\$nextIFD, 0);
|
|
217
217
|
$dirStart or last;
|
|
218
218
|
$offName = $nextOffName;
|
|
219
|
+
# protect against infinite loop
|
|
220
|
+
if ($$et{PROCESSED}{$dirStart}) {
|
|
221
|
+
$et->Warn("$dirName pointer references previous $$et{PROCESSED}{$dirStart} directory");
|
|
222
|
+
last;
|
|
223
|
+
} else {
|
|
224
|
+
$$et{PROCESSED}{$dirStart} = $dirName;
|
|
225
|
+
}
|
|
219
226
|
}
|
|
220
227
|
return 1;
|
|
221
228
|
}
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.68';
|
|
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)
|
|
@@ -608,18 +608,24 @@ $VERSION = '4.66';
|
|
|
608
608
|
'61182.33' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
609
609
|
'61182.34' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
610
610
|
'61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
611
|
-
'61182.36' => 'Canon RF
|
|
612
|
-
'61182.37' => 'Canon RF
|
|
613
|
-
'61182.38' => 'Canon RF
|
|
614
|
-
'61182.39' => 'Canon RF 800mm F5.6L IS USM
|
|
615
|
-
'61182.40' => 'Canon RF
|
|
616
|
-
'61182.41' => 'Canon RF
|
|
617
|
-
'61182.42' => 'Canon RF 1200mm F8L IS USM
|
|
618
|
-
'61182.43' => 'Canon RF
|
|
619
|
-
'61182.44' => 'Canon RF
|
|
620
|
-
'61182.45' => 'Canon RF
|
|
611
|
+
'61182.36' => 'Canon RF 600mm F4L IS USM + RF1.4x', #42
|
|
612
|
+
'61182.37' => 'Canon RF 600mm F4L IS USM + RF2x', #42
|
|
613
|
+
'61182.38' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
|
|
614
|
+
'61182.39' => 'Canon RF 800mm F5.6L IS USM', #42
|
|
615
|
+
'61182.40' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
|
|
616
|
+
'61182.41' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
|
|
617
|
+
'61182.42' => 'Canon RF 1200mm F8L IS USM', #42
|
|
618
|
+
'61182.43' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
|
|
619
|
+
'61182.44' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
|
|
620
|
+
'61182.45' => 'Canon RF 135mm F1.8 L IS USM', #42
|
|
621
|
+
'61182.46' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
|
|
622
|
+
'61182.47' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
|
|
623
|
+
'61182.48' => 'Canon RF 100-300mm F2.8L IS USM', #42
|
|
624
|
+
'61182.49' => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
|
|
625
|
+
'61182.50' => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
|
|
626
|
+
'61182.51' => 'Canon RF 28mm F2.8 STM', #42
|
|
621
627
|
# we need the RFLensType values for the following...
|
|
622
|
-
'61182.
|
|
628
|
+
'61182.52' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
|
|
623
629
|
65535 => 'n/a',
|
|
624
630
|
);
|
|
625
631
|
|
|
@@ -983,6 +989,8 @@ $VERSION = '4.66';
|
|
|
983
989
|
0x80000480 => 'EOS R50', #42
|
|
984
990
|
0x80000481 => 'EOS R6 Mark II', #42
|
|
985
991
|
0x80000487 => 'EOS R8', #42
|
|
992
|
+
0x80000491 => 'PowerShot V10', #25
|
|
993
|
+
0x80000498 => 'EOS R100', #25
|
|
986
994
|
0x80000520 => 'EOS D2000C', #IB
|
|
987
995
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
988
996
|
);
|
|
@@ -1696,6 +1704,12 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
1696
1704
|
# Writable => 'int32u',
|
|
1697
1705
|
# Protected => 2,
|
|
1698
1706
|
},
|
|
1707
|
+
0x82 => { #github219 (found on 1DS)
|
|
1708
|
+
Name => 'RawDataLength',
|
|
1709
|
+
# (can't yet write 1DS raw files)
|
|
1710
|
+
# Writable => 'int32u',
|
|
1711
|
+
# Protected => 2,
|
|
1712
|
+
},
|
|
1699
1713
|
0x83 => { #PH
|
|
1700
1714
|
Name => 'OriginalDecisionDataOffset',
|
|
1701
1715
|
Writable => 'int32u',
|
|
@@ -2092,6 +2106,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
2092
2106
|
TagTable => 'Image::ExifTool::Canon::AFConfig',
|
|
2093
2107
|
}
|
|
2094
2108
|
},
|
|
2109
|
+
# 0x402b - crop information (forum14904)
|
|
2095
2110
|
0x403f => { #25
|
|
2096
2111
|
Name => 'RawBurstModeRoll',
|
|
2097
2112
|
SubDirectory => {
|
|
@@ -6856,6 +6871,8 @@ my %ciMaxFocal = (
|
|
|
6856
6871
|
290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
6857
6872
|
291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
6858
6873
|
292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
6874
|
+
293 => 'Canon RF 600mm F4L IS USM + RF1.4x', #42
|
|
6875
|
+
294 => 'Canon RF 600mm F4L IS USM + RF2x', #42
|
|
6859
6876
|
295 => 'Canon RF 800mm F5.6L IS USM', #42
|
|
6860
6877
|
296 => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
|
|
6861
6878
|
297 => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
|
|
@@ -6866,6 +6883,10 @@ my %ciMaxFocal = (
|
|
|
6866
6883
|
303 => 'Canon RF 135mm F1.8 L IS USM', #42
|
|
6867
6884
|
304 => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
|
|
6868
6885
|
305 => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
|
|
6886
|
+
306 => 'Canon RF 100-300mm F2.8L IS USM', #42
|
|
6887
|
+
307 => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
|
|
6888
|
+
308 => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
|
|
6889
|
+
313 => 'Canon RF 28mm F2.8 STM', #42
|
|
6869
6890
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6870
6891
|
},
|
|
6871
6892
|
},
|
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
21
21
|
use Image::ExifTool::Exif;
|
|
22
22
|
use Image::ExifTool::Canon;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.61';
|
|
25
25
|
|
|
26
26
|
sub WriteCRW($$);
|
|
27
27
|
sub ProcessCanonRaw($$$);
|
|
@@ -698,9 +698,9 @@ sub ProcessCanonRaw($$$)
|
|
|
698
698
|
$format ne 'string' and not $subdir;
|
|
699
699
|
} else {
|
|
700
700
|
$valueDataPos = $ptr;
|
|
701
|
-
# do
|
|
702
|
-
if ($$et{
|
|
703
|
-
$raf->Seek($ptr, 0) and $et->
|
|
701
|
+
# do hash of image data if requested
|
|
702
|
+
if ($$et{ImageDataHash} and $tagID == 0x2005) {
|
|
703
|
+
$raf->Seek($ptr, 0) and $et->ImageDataHash($raf, $size, 'raw');
|
|
704
704
|
}
|
|
705
705
|
if ($size <= 512 or ($verbose > 2 and $size <= 65536)
|
|
706
706
|
or ($tagInfo and ($$tagInfo{SubDirectory}
|
|
@@ -23,7 +23,7 @@ use vars qw($VERSION);
|
|
|
23
23
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
24
24
|
use Image::ExifTool::Canon;
|
|
25
25
|
|
|
26
|
-
$VERSION = '1.
|
|
26
|
+
$VERSION = '1.36';
|
|
27
27
|
|
|
28
28
|
sub ProcessCanonVRD($$;$);
|
|
29
29
|
sub WriteCanonVRD($$;$);
|
|
@@ -187,6 +187,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
|
|
|
187
187
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
|
|
188
188
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
189
189
|
WRITABLE => 1,
|
|
190
|
+
PERMANENT => 1, # (can't add/delete these individually)
|
|
190
191
|
FIRST_ENTRY => 0,
|
|
191
192
|
GROUPS => { 2 => 'Image' },
|
|
192
193
|
DATAMEMBER => [ 0x002 ], # necessary for writing
|
|
@@ -485,6 +486,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
|
|
|
485
486
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
|
|
486
487
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
487
488
|
WRITABLE => 1,
|
|
489
|
+
PERMANENT => 1, # (can't add/delete these individually)
|
|
488
490
|
FIRST_ENTRY => 0,
|
|
489
491
|
FORMAT => 'int16s',
|
|
490
492
|
DATAMEMBER => [ 0x58, 0xdc, 0xdf, 0xe0 ], # (required for DataMember and var-format tags)
|
|
@@ -999,6 +1001,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
|
|
|
999
1001
|
PROCESS_PROC => \&ProcessDR4,
|
|
1000
1002
|
WRITE_PROC => \&ProcessDR4,
|
|
1001
1003
|
WRITABLE => 1,
|
|
1004
|
+
PERMANENT => 1, # (can't add/delete these individually)
|
|
1002
1005
|
GROUPS => { 1 => 'CanonDR4', 2 => 'Image' },
|
|
1003
1006
|
VARS => { HEX_ID => 1, SORT_PROC => \&SortDR4 },
|
|
1004
1007
|
NOTES => q{
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
# 30) http://geotiff.maptools.org/spec/geotiffhome.html
|
|
44
44
|
# 31) https://android.googlesource.com/platform/external/dng_sdk/+/refs/heads/master/source/dng_tag_codes.h
|
|
45
45
|
# 32) Jeffry Friedl private communication
|
|
46
|
+
# 33) https://www.cipa.jp/std/documents/download_e.html?DC-008-Translation-2023-E (Exif 3.0)
|
|
46
47
|
# IB) Iliah Borg private communication (LibRaw)
|
|
47
48
|
# JD) Jens Duttke private communication
|
|
48
49
|
#------------------------------------------------------------------------------
|
|
@@ -65,7 +66,7 @@ sub RebuildMakerNotes($$$);
|
|
|
65
66
|
sub EncodeExifText($$);
|
|
66
67
|
sub ValidateIFD($;$);
|
|
67
68
|
sub ValidateImageData($$$;$);
|
|
68
|
-
sub
|
|
69
|
+
sub AddImageDataHash($$$);
|
|
69
70
|
sub ProcessTiffIFD($$$);
|
|
70
71
|
sub PrintParameter($$$);
|
|
71
72
|
sub GetOffList($$$$$);
|
|
@@ -79,6 +80,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
|
|
|
79
80
|
|
|
80
81
|
# byte sizes for the various EXIF format types below
|
|
81
82
|
@formatSize = (undef,1,1,2,4,8,1,1,2,4,8,4,8,4,2,8,8,8,8);
|
|
83
|
+
$formatSize[129] = 1; # (Exif 3.0)
|
|
82
84
|
|
|
83
85
|
@formatName = (
|
|
84
86
|
undef, 'int8u', 'string', 'int16u',
|
|
@@ -87,6 +89,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
|
|
|
87
89
|
'double', 'ifd', 'unicode', 'complex',
|
|
88
90
|
'int64u', 'int64s', 'ifd64', # (new BigTIFF formats)
|
|
89
91
|
);
|
|
92
|
+
$formatName[129] = 'utf8'; # (Exif 3.0)
|
|
90
93
|
|
|
91
94
|
# hash to look up EXIF format numbers by name
|
|
92
95
|
# (format types are all lower case)
|
|
@@ -110,6 +113,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
|
|
|
110
113
|
'int64u' => 16, # LONG8 [BigTIFF]
|
|
111
114
|
'int64s' => 17, # SLONG8 [BigTIFF]
|
|
112
115
|
'ifd64' => 18, # IFD8 (with int64u format) [BigTIFF]
|
|
116
|
+
'utf8' => 129,# UTF-8 (Exif 3.0)
|
|
113
117
|
# Note: unicode and complex types are not yet properly supported by ExifTool.
|
|
114
118
|
# These are types which have been observed in the Adobe DNG SDK code, but
|
|
115
119
|
# aren't fully supported there either. We know the sizes, but that's about it.
|
|
@@ -2823,6 +2827,13 @@ my %opcodeInfo = (
|
|
|
2823
2827
|
0xa433 => { Name => 'LensMake', Writable => 'string' }, #24
|
|
2824
2828
|
0xa434 => { Name => 'LensModel', Writable => 'string' }, #24
|
|
2825
2829
|
0xa435 => { Name => 'LensSerialNumber', Writable => 'string' }, #24
|
|
2830
|
+
0xa436 => { Name => 'Title', Writable => 'string', Avoid => 1 }, #33
|
|
2831
|
+
0xa437 => { Name => 'Photographer', Writable => 'string' }, #33
|
|
2832
|
+
0xa438 => { Name => 'ImageEditor', Writable => 'string' }, #33
|
|
2833
|
+
0xa439 => { Name => 'CameraFirmware', Writable => 'string' }, #33
|
|
2834
|
+
0xa43a => { Name => 'RAWDevelopingSoftware', Writable => 'string' }, #33
|
|
2835
|
+
0xa43b => { Name => 'ImageEditingSoftware', Writable => 'string' }, #33
|
|
2836
|
+
0xa43c => { Name => 'MetadataEditingSoftware', Writable => 'string' }, #33
|
|
2826
2837
|
0xa460 => { #Exif2.32
|
|
2827
2838
|
Name => 'CompositeImage',
|
|
2828
2839
|
Writable => 'int16u',
|
|
@@ -4910,10 +4921,10 @@ my %subSecConv = (
|
|
|
4910
4921
|
Writable => 1,
|
|
4911
4922
|
Protected => 1,
|
|
4912
4923
|
WriteAlso => {
|
|
4913
|
-
GPSLatitude => '(defined $val and $val =~ /(
|
|
4914
|
-
GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?)
|
|
4915
|
-
GPSLongitude => '(defined $val and $val =~
|
|
4916
|
-
GPSLongitudeRef => '(defined $val and $val =~
|
|
4924
|
+
GPSLatitude => '(defined $val and $val =~ /(.*) /) ? $1 : undef',
|
|
4925
|
+
GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?) /) ? ($1 ? "S" : "N") : undef',
|
|
4926
|
+
GPSLongitude => '(defined $val and $val =~ / (.*)$/) ? $1 : undef',
|
|
4927
|
+
GPSLongitudeRef => '(defined $val and $val =~ / (-?)/) ? ($1 ? "W" : "E") : undef',
|
|
4917
4928
|
},
|
|
4918
4929
|
PrintConvInv => q{
|
|
4919
4930
|
return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
|
|
@@ -4921,7 +4932,7 @@ my %subSecConv = (
|
|
|
4921
4932
|
require Image::ExifTool::GPS;
|
|
4922
4933
|
$lat = Image::ExifTool::GPS::ToDegrees($lat, 1, "lat");
|
|
4923
4934
|
$lon = Image::ExifTool::GPS::ToDegrees($lon, 1, "lon");
|
|
4924
|
-
return "$lat
|
|
4935
|
+
return "$lat $lon";
|
|
4925
4936
|
},
|
|
4926
4937
|
Require => {
|
|
4927
4938
|
0 => 'GPSLatitude',
|
|
@@ -5929,12 +5940,12 @@ sub ProcessExif($$$)
|
|
|
5929
5940
|
my ($verbose,$validate,$saveFormat) = @{$$et{OPTIONS}}{qw(Verbose Validate SaveFormat)};
|
|
5930
5941
|
my $htmlDump = $$et{HTML_DUMP};
|
|
5931
5942
|
my $success = 1;
|
|
5932
|
-
my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName, $
|
|
5943
|
+
my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName, $doHash);
|
|
5933
5944
|
my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
|
|
5934
5945
|
my $isExif = ($tagTablePtr eq \%Image::ExifTool::Exif::Main);
|
|
5935
5946
|
|
|
5936
|
-
# set flag to calculate image data
|
|
5937
|
-
$
|
|
5947
|
+
# set flag to calculate image data hash if requested
|
|
5948
|
+
$doHash = 1 if $$et{ImageDataHash} and (($$et{FILE_TYPE} eq 'TIFF' and not $base and not $inMakerNotes) or
|
|
5938
5949
|
($$et{FILE_TYPE} eq 'RAF' and $dirName eq 'FujiIFD'));
|
|
5939
5950
|
|
|
5940
5951
|
# set encoding to assume for strings
|
|
@@ -6088,7 +6099,7 @@ sub ProcessExif($$$)
|
|
|
6088
6099
|
my $format = Get16u($dataPt, $entry+2);
|
|
6089
6100
|
my $count = Get32u($dataPt, $entry+4);
|
|
6090
6101
|
# (Apple uses the BigTIFF format code 16 in the maker notes of their ProRaw DNG files)
|
|
6091
|
-
if (($format < 1 or $format > 13) and not ($format == 16 and $$et{Make} eq 'Apple' and $inMakerNotes)) {
|
|
6102
|
+
if (($format < 1 or $format > 13) and $format != 129 and not ($format == 16 and $$et{Make} eq 'Apple' and $inMakerNotes)) {
|
|
6092
6103
|
if ($mapFmt and $$mapFmt{$format}) {
|
|
6093
6104
|
$format = $$mapFmt{$format};
|
|
6094
6105
|
} else {
|
|
@@ -6404,7 +6415,13 @@ sub ProcessExif($$$)
|
|
|
6404
6415
|
# convert according to specified format
|
|
6405
6416
|
$val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize,\$rational);
|
|
6406
6417
|
# re-code if necessary
|
|
6407
|
-
|
|
6418
|
+
if (defined $val) {
|
|
6419
|
+
if ($formatStr eq 'utf8') {
|
|
6420
|
+
$val = $et->Decode($val, 'UTF8');
|
|
6421
|
+
} elsif ($strEnc and $formatStr eq 'string') {
|
|
6422
|
+
$val = $et->Decode($val, $strEnc);
|
|
6423
|
+
}
|
|
6424
|
+
}
|
|
6408
6425
|
}
|
|
6409
6426
|
}
|
|
6410
6427
|
|
|
@@ -6781,7 +6798,7 @@ sub ProcessExif($$$)
|
|
|
6781
6798
|
}
|
|
6782
6799
|
$val = join(' ', @vals);
|
|
6783
6800
|
}
|
|
6784
|
-
if ($validate or $
|
|
6801
|
+
if ($validate or $doHash) {
|
|
6785
6802
|
if ($$tagInfo{OffsetPair}) {
|
|
6786
6803
|
$offsetInfo{$tagID} = [ $tagInfo, $val ];
|
|
6787
6804
|
} elsif ($saveForValidate{$tagID} and $isExif) {
|
|
@@ -6800,8 +6817,8 @@ sub ProcessExif($$$)
|
|
|
6800
6817
|
}
|
|
6801
6818
|
|
|
6802
6819
|
if (%offsetInfo) {
|
|
6803
|
-
# calculate image data
|
|
6804
|
-
|
|
6820
|
+
# calculate image data hash if requested
|
|
6821
|
+
AddImageDataHash($et, $dirInfo, \%offsetInfo) if $doHash;
|
|
6805
6822
|
# validate image data offsets for this IFD (note: modifies %offsetInfo)
|
|
6806
6823
|
Image::ExifTool::Validate::ValidateOffsetInfo($et, \%offsetInfo, $dirName, $inMakerNotes) if $validate;
|
|
6807
6824
|
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
# 4) http://msdn.microsoft.com/en-us/library/aa380374.aspx
|
|
12
12
|
# 5) http://www.cpan.org/modules/by-authors/id/H/HC/HCARVEY/File-MSWord-0.1.zip
|
|
13
13
|
# 6) https://msdn.microsoft.com/en-us/library/cc313153(v=office.12).aspx
|
|
14
|
+
# 7) https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-oshared/3ef02e83-afef-4b6c-9585-c109edd24e07
|
|
14
15
|
#------------------------------------------------------------------------------
|
|
15
16
|
|
|
16
17
|
package Image::ExifTool::FlashPix;
|
|
@@ -21,7 +22,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
21
22
|
use Image::ExifTool::Exif;
|
|
22
23
|
use Image::ExifTool::ASF; # for GetGUID()
|
|
23
24
|
|
|
24
|
-
$VERSION = '1.
|
|
25
|
+
$VERSION = '1.46';
|
|
25
26
|
|
|
26
27
|
sub ProcessFPX($$);
|
|
27
28
|
sub ProcessFPXR($$$);
|
|
@@ -587,6 +588,7 @@ my %fpxFileType = (
|
|
|
587
588
|
However, ExifTool will also extract any other information found in the
|
|
588
589
|
UserDefined properties.
|
|
589
590
|
},
|
|
591
|
+
# 0x01 => 'CodePage', #7
|
|
590
592
|
0x02 => 'Category',
|
|
591
593
|
0x03 => 'PresentationTarget',
|
|
592
594
|
0x04 => 'Bytes',
|
|
@@ -631,12 +633,16 @@ my %fpxFileType = (
|
|
|
631
633
|
Name => 'AppVersion',
|
|
632
634
|
ValueConv => 'sprintf("%d.%.4d",$val >> 16, $val & 0xffff)',
|
|
633
635
|
},
|
|
634
|
-
# 0x18 ? seen -1
|
|
636
|
+
# 0x18 ? seen -1 (DigitalSignature, VtDigSig format, ref 7)
|
|
635
637
|
# 0x19 ? seen 0
|
|
636
638
|
# 0x1a ? seen 0
|
|
637
639
|
# 0x1b ? seen 0
|
|
638
640
|
# 0x1c ? seen 0,1
|
|
639
641
|
# 0x1d ? seen 1
|
|
642
|
+
0x1a => 'ContentType', #7, github#217
|
|
643
|
+
0x1b => 'ContentStatus', #7, github#217
|
|
644
|
+
0x1c => 'Language', #7, github#217
|
|
645
|
+
0x1d => 'DocVersion', #7, github#217
|
|
640
646
|
# 0x1e ? seen 1
|
|
641
647
|
# 0x1f ? seen 1,5
|
|
642
648
|
# 0x20 ? seen 0,5
|
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
32
32
|
use Image::ExifTool::Exif;
|
|
33
33
|
|
|
34
|
-
$VERSION = '1.
|
|
34
|
+
$VERSION = '1.89';
|
|
35
35
|
|
|
36
36
|
sub ProcessFujiDir($$$);
|
|
37
37
|
sub ProcessFaceRec($$$);
|
|
@@ -670,6 +670,7 @@ my %faceCategories = (
|
|
|
670
670
|
0x800 => 'Classic Negative', #forum10536
|
|
671
671
|
0x900 => 'Bleach Bypass', #forum10890
|
|
672
672
|
0xa00 => 'Nostalgic Neg', #forum12085
|
|
673
|
+
0xb00 => 'Reala ACE', #forum15190
|
|
673
674
|
},
|
|
674
675
|
},
|
|
675
676
|
0x1402 => { #2
|
|
@@ -897,6 +898,8 @@ my %faceCategories = (
|
|
|
897
898
|
25 => 'Aircraft Cockpit',
|
|
898
899
|
26 => 'Train Front',
|
|
899
900
|
27 => 'Train Cockpit',
|
|
901
|
+
28 => 'Animal Head (28)', #forum15192
|
|
902
|
+
29 => 'Animal Body (29)', #forum15192
|
|
900
903
|
},'REPEAT'],
|
|
901
904
|
},
|
|
902
905
|
# 0x4202 int8u[-1] - number of cooredinates in each rectangle? (ref 11)
|
|
@@ -1687,8 +1690,8 @@ sub ProcessRAF($$)
|
|
|
1687
1690
|
my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::IFD');
|
|
1688
1691
|
# this is TIFF-format data only for some models, so no warning if it fails
|
|
1689
1692
|
unless ($et->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF)) {
|
|
1690
|
-
# do
|
|
1691
|
-
$et->
|
|
1693
|
+
# do hash of image data if necessary
|
|
1694
|
+
$et->ImageDataHash($raf, $len, 'raw') if $$et{ImageDataHash} and $raf->Seek($start,0);
|
|
1692
1695
|
}
|
|
1693
1696
|
delete $$et{SET_GROUP1};
|
|
1694
1697
|
$ifdNum = ($ifdNum || 1) + 1;
|
|
@@ -106,8 +106,10 @@ my %coordConv = (
|
|
|
106
106
|
return undef unless $inv and $val =~ /^([-+0-9])/;
|
|
107
107
|
return($1 eq '-' ? 1 : 0);
|
|
108
108
|
},
|
|
109
|
-
0 => 'Above Sea Level',
|
|
110
|
-
1 => 'Below Sea Level',
|
|
109
|
+
0 => 'Above Sea Level', # (ellipsoidal surface, Exif 3.0)
|
|
110
|
+
1 => 'Below Sea Level', # (ellipsoidal surface, Exif 3.0)
|
|
111
|
+
# 2 => 'Above Sea Level', # (Exif 3.0)
|
|
112
|
+
# 3 => 'Below Sea Level', # (Exif 3.0)
|
|
111
113
|
},
|
|
112
114
|
},
|
|
113
115
|
0x0006 => {
|
|
@@ -289,6 +291,7 @@ my %coordConv = (
|
|
|
289
291
|
Name => 'GPSProcessingMethod',
|
|
290
292
|
Writable => 'undef',
|
|
291
293
|
Notes => 'values of "GPS", "CELLID", "WLAN" or "MANUAL" by the EXIF spec.',
|
|
294
|
+
# (or QZZSS, GALILEO, GLONASS, BEIDOU or NAVIC in Exif 3.0)
|
|
292
295
|
RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1,$tag)',
|
|
293
296
|
RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
|
|
294
297
|
},
|
|
@@ -29,7 +29,7 @@ use vars qw($VERSION);
|
|
|
29
29
|
use Image::ExifTool qw(:Public);
|
|
30
30
|
use Image::ExifTool::GPS;
|
|
31
31
|
|
|
32
|
-
$VERSION = '1.
|
|
32
|
+
$VERSION = '1.72';
|
|
33
33
|
|
|
34
34
|
sub JITTER() { return 2 } # maximum time jitter
|
|
35
35
|
|
|
@@ -224,6 +224,9 @@ sub LoadTrackLog($$;$)
|
|
|
224
224
|
# determine file format
|
|
225
225
|
if (not $format) {
|
|
226
226
|
s/^\xef\xbb\xbf//; # remove leading BOM if it exists
|
|
227
|
+
if (/^\xff\xfe|\xfe\xff/) {
|
|
228
|
+
return "ExifTool doesn't yet read UTF16-format track logs";
|
|
229
|
+
}
|
|
227
230
|
if (/^<(\?xml|gpx)[\s>]/) { # look for XML or GPX header
|
|
228
231
|
$format = 'XML';
|
|
229
232
|
# check for NMEA sentence
|
|
@@ -1106,7 +1109,7 @@ sub SetGeoValues($$;$)
|
|
|
1106
1109
|
$iExt = $i1;
|
|
1107
1110
|
}
|
|
1108
1111
|
if (abs($time - $tn) > $geoMaxExtSecs) {
|
|
1109
|
-
$err or $err = 'Time is too far from nearest GPS fix';
|
|
1112
|
+
$err or $err = 'Time is too far from nearest GPS fix'.' '.abs($time-$tn).' '.$geoMaxExtSecs;
|
|
1110
1113
|
$et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), "\n") if $verbose > 2;
|
|
1111
1114
|
$fix = { } if $$geotag{DateTimeOnly};
|
|
1112
1115
|
} else {
|