exiftool_vendored 12.62.0 → 12.64.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +50 -1
- data/bin/MANIFEST +4 -0
- data/bin/META.json +4 -1
- data/bin/META.yml +4 -1
- data/bin/Makefile.PL +7 -1
- data/bin/README +50 -46
- data/bin/config_files/guano.config +161 -0
- data/bin/exiftool +88 -62
- data/bin/lib/Image/ExifTool/7Z.pm +793 -0
- data/bin/lib/Image/ExifTool/Apple.pm +6 -3
- data/bin/lib/Image/ExifTool/Canon.pm +1 -0
- data/bin/lib/Image/ExifTool/CanonRaw.pm +4 -4
- data/bin/lib/Image/ExifTool/CanonVRD.pm +4 -1
- data/bin/lib/Image/ExifTool/Exif.pm +31 -14
- data/bin/lib/Image/ExifTool/FujiFilm.pm +3 -3
- data/bin/lib/Image/ExifTool/GPS.pm +5 -2
- data/bin/lib/Image/ExifTool/Geotag.pm +4 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +226 -28
- data/bin/lib/Image/ExifTool/Lang/fr.pm +1467 -202
- data/bin/lib/Image/ExifTool/MPF.pm +2 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +16 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +419 -5
- data/bin/lib/Image/ExifTool/NikonCustom.pm +13 -3
- data/bin/lib/Image/ExifTool/PDF.pm +9 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +8 -1
- data/bin/lib/Image/ExifTool/PNG.pm +6 -6
- data/bin/lib/Image/ExifTool/PhaseOne.pm +5 -5
- data/bin/lib/Image/ExifTool/QuickTime.pm +74 -21
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -19
- data/bin/lib/Image/ExifTool/README +2 -2
- data/bin/lib/Image/ExifTool/RIFF.pm +11 -9
- data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +4 -4
- data/bin/lib/Image/ExifTool/Sony.pm +103 -8
- data/bin/lib/Image/ExifTool/TagLookup.pm +4738 -4630
- data/bin/lib/Image/ExifTool/TagNames.pod +249 -5
- data/bin/lib/Image/ExifTool/Validate.pm +17 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +9 -7
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +21 -9
- data/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
- data/bin/lib/Image/ExifTool/Writer.pl +28 -10
- data/bin/lib/Image/ExifTool/XMP.pm +14 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +32 -0
- data/bin/lib/Image/ExifTool/XMPStruct.pl +96 -28
- data/bin/lib/Image/ExifTool/ZIP.pm +5 -5
- data/bin/lib/Image/ExifTool.pm +67 -39
- data/bin/lib/Image/ExifTool.pod +83 -52
- data/bin/perl-Image-ExifTool.spec +44 -44
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +4 -2
@@ -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.09';
|
20
20
|
|
21
21
|
sub ConvertPLIST($$);
|
22
22
|
|
@@ -182,7 +182,10 @@ sub ConvertPLIST($$);
|
|
182
182
|
# 0x0028 - int32s (UBMethod, ref 2)
|
183
183
|
# 0x0029 - string (SpatialOverCaptureGroupIdentifier, ref 2)
|
184
184
|
# 0x002A - (iCloudServerSoftwareVersionForDynamicallyGeneratedMedia, ref 2)
|
185
|
-
|
185
|
+
0x002b => {
|
186
|
+
Name => 'PhotoIdentifier', #2
|
187
|
+
Writable => 'string',
|
188
|
+
},
|
186
189
|
# 0x002C - (SpatialOverCaptureImageType, ref 2)
|
187
190
|
# 0x002D - (CCT, ref 2)
|
188
191
|
# 0x002E - (ApsMode, ref 2)
|
@@ -308,7 +311,7 @@ sub ConvertPLIST($$)
|
|
308
311
|
$val = $$dirInfo{Value};
|
309
312
|
if (ref $val eq 'HASH' and not $et->Options('Struct')) {
|
310
313
|
require 'Image/ExifTool/XMPStruct.pl';
|
311
|
-
$val = Image::ExifTool::XMP::SerializeStruct($val);
|
314
|
+
$val = Image::ExifTool::XMP::SerializeStruct($et, $val);
|
312
315
|
}
|
313
316
|
return $val;
|
314
317
|
}
|
@@ -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
|
}
|
@@ -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.88';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -1687,8 +1687,8 @@ sub ProcessRAF($$)
|
|
1687
1687
|
my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::IFD');
|
1688
1688
|
# this is TIFF-format data only for some models, so no warning if it fails
|
1689
1689
|
unless ($et->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF)) {
|
1690
|
-
# do
|
1691
|
-
$et->
|
1690
|
+
# do hash of image data if necessary
|
1691
|
+
$et->ImageDataHash($raf, $len, 'raw') if $$et{ImageDataHash} and $raf->Seek($start,0);
|
1692
1692
|
}
|
1693
1693
|
delete $$et{SET_GROUP1};
|
1694
1694
|
$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
|