exiftool-vendored.exe 12.44.0 → 12.45.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/exiftool_files/Changes +28 -0
- package/bin/exiftool_files/README +2 -2
- package/bin/exiftool_files/exiftool.pl +16 -13
- package/bin/exiftool_files/fmt_files/gpx.fmt +3 -0
- package/bin/exiftool_files/fmt_files/gpx_wpt.fmt +3 -0
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +7 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +17 -11
- package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +7 -8
- package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +9 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +5 -5
- package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +4 -3
- package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Matroska.pm +24 -16
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +6 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +18 -5
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +80 -4
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +12 -1
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +36 -13
- package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +81 -22
- package/bin/exiftool_files/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +5 -2
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +7 -3
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +11 -4
- package/bin/exiftool_files/lib/Image/ExifTool.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pod +6 -5
- package/package.json +1 -1
|
@@ -7,6 +7,34 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 12.42. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
Sept. 16, 2022 - Version 12.45
|
|
11
|
+
|
|
12
|
+
- Added new IPTC Video Metadata version 1.3 tags
|
|
13
|
+
- Added a couple of new Canon lenses (thanks Norbert Wasser)
|
|
14
|
+
- Added a new Sony LensType (thanks Jos Roost)
|
|
15
|
+
- Added known Unknown value for IPTC ChromaticityColorant (thanks Herb)
|
|
16
|
+
- Added new Nikon WhiteBalanceFineTune tag (thanks Milos Komarcevic)
|
|
17
|
+
- Extract the raw thermal data from all frames of a SEQ file when -ee2 is used
|
|
18
|
+
- Decode individual tags in QuickTime ColorRepresentation
|
|
19
|
+
- Decode a new Matroska tag
|
|
20
|
+
- Improved verbose "nothing changed" messages when writing
|
|
21
|
+
- Patched -ee option to extract metadata after the first Cluster in MKV videos
|
|
22
|
+
(previously only -U and -v did this)
|
|
23
|
+
- Patched to differentiate Java bytecode .class files from Mach-O fat binaries
|
|
24
|
+
- Patched to avoid "Use of uninitialized value" warning when deleting GPS
|
|
25
|
+
coordinates via the newly writable Composite tags
|
|
26
|
+
- Patched to avoid duplicating raw data when writing Sony ARW images where the
|
|
27
|
+
raw data is double-referenced as both strips and tiles (affects ARW images
|
|
28
|
+
from some newer models like the ILCE-1 when SonyRawFileType is "Lossless
|
|
29
|
+
Compressed RAW 2")
|
|
30
|
+
- Patched to avoid "fixing" the order of IFD entries in TIFF-based RAW files
|
|
31
|
+
to improve compatibility with some RAW viewers
|
|
32
|
+
- Minor change to Composite FileNumber to remove "-" when -n is used
|
|
33
|
+
- Fixed problem extracting some timed metadata when "-api ignoretags=all" was
|
|
34
|
+
used with "-api requesttags" to request the specific information
|
|
35
|
+
- Fixed -validate feature to avoid incorrectly warning about non-capitalized
|
|
36
|
+
boolean values in XMP
|
|
37
|
+
|
|
10
38
|
July 21, 2022 - Version 12.44
|
|
11
39
|
|
|
12
40
|
- Added a few new Sony lenses (thanks Jos Roost)
|
|
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
|
|
|
107
107
|
terminal window to extract and run ExifTool:
|
|
108
108
|
|
|
109
109
|
cd ~/Desktop
|
|
110
|
-
gzip -dc Image-ExifTool-12.
|
|
111
|
-
cd Image-ExifTool-12.
|
|
110
|
+
gzip -dc Image-ExifTool-12.45.tar.gz | tar -xf -
|
|
111
|
+
cd Image-ExifTool-12.45
|
|
112
112
|
./exiftool t/images/ExifTool.jpg
|
|
113
113
|
|
|
114
114
|
Note: These commands extract meta information from one of the test images.
|
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '12.
|
|
14
|
+
my $version = '12.45';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -2305,7 +2305,7 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2305
2305
|
if (ref $val) {
|
|
2306
2306
|
# happens with -X, -j or -php when combined with -b:
|
|
2307
2307
|
if (defined $binaryOutput and not $binaryOutput and $$et{TAG_INFO}{$tag}{Protected}) {
|
|
2308
|
-
# avoid extracting
|
|
2308
|
+
# avoid extracting Unsafe binary tags (eg. data blocks) [insider information]
|
|
2309
2309
|
my $lcTag = lc $tag;
|
|
2310
2310
|
$lcTag =~ s/ .*//;
|
|
2311
2311
|
next unless $$et{REQ_TAG_LOOKUP}{$lcTag} or ($$et{OPTIONS}{RequestAll} || 0) > 2;
|
|
@@ -5010,12 +5010,12 @@ OPTIONS
|
|
|
5010
5010
|
|
|
5011
5011
|
8) With the redirection feature, copying a tag directly (ie.
|
|
5012
5012
|
"'-*DSTTAG*<*SRCTAG*'") is not the same as interpolating its value
|
|
5013
|
-
inside a string (ie. "'-*DSTTAG*<$*SRCTAG*'") for
|
|
5014
|
-
shortcut tags, tag names containing wildcards,
|
|
5015
|
-
variables. When copying directly, the values of each
|
|
5016
|
-
source tag are copied individually to the destination tag
|
|
5017
|
-
they were separate assignments). However, when interpolated
|
|
5018
|
-
a string, list items and the values of shortcut tags are
|
|
5013
|
+
inside a string (ie. "'-*DSTTAG*<$*SRCTAG*'") for source tags which
|
|
5014
|
+
are list-type tags, shortcut tags, tag names containing wildcards,
|
|
5015
|
+
or UserParam variables. When copying directly, the values of each
|
|
5016
|
+
matching source tag are copied individually to the destination tag
|
|
5017
|
+
(as if they were separate assignments). However, when interpolated
|
|
5018
|
+
inside a string, list items and the values of shortcut tags are
|
|
5019
5019
|
concatenated (with a separator set by the -sep option), and
|
|
5020
5020
|
wildcards are not allowed. Also, UserParam variables are available
|
|
5021
5021
|
only when interpolated in a string. Another difference is that a
|
|
@@ -5338,7 +5338,9 @@ OPTIONS
|
|
|
5338
5338
|
information (see -t for details). The JSON output is UTF-8
|
|
5339
5339
|
regardless of any -L or -charset option setting, but the UTF-8
|
|
5340
5340
|
validation is disabled if a character set other than UTF-8 is
|
|
5341
|
-
specified.
|
|
5341
|
+
specified. Note that ExifTool quotes JSON values only if they don't
|
|
5342
|
+
look like numbers (regardless of the original storage format or the
|
|
5343
|
+
relevant metadata specification).
|
|
5342
5344
|
|
|
5343
5345
|
If *JSONFILE* is specified, the file is imported and the tag
|
|
5344
5346
|
definitions from the file are used to set tag values on a per-file
|
|
@@ -5492,7 +5494,7 @@ OPTIONS
|
|
|
5492
5494
|
|
|
5493
5495
|
produces output like this:
|
|
5494
5496
|
|
|
5495
|
-
-- Generated by ExifTool 12.
|
|
5497
|
+
-- Generated by ExifTool 12.45 --
|
|
5496
5498
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5497
5499
|
(f/5.6, 1/60s, ISO 100)
|
|
5498
5500
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6008,8 +6010,9 @@ OPTIONS
|
|
|
6008
6010
|
|
|
6009
6011
|
3) Tags in the string are interpolated the same way as with -p
|
|
6010
6012
|
before the expression is evaluated. In this interpolation, $/ is
|
|
6011
|
-
converted to a newline and $$ represents a single "$" symbol
|
|
6012
|
-
Perl variables, if used, require a double "$"
|
|
6013
|
+
converted to a newline and $$ represents a single "$" symbol. So
|
|
6014
|
+
Perl variables, if used, require a double "$", and regular
|
|
6015
|
+
expressions ending in $/ must use $$/ instead.
|
|
6013
6016
|
|
|
6014
6017
|
4) The condition may only test tags from the file being processed.
|
|
6015
6018
|
To process one file based on tags from another, two steps are
|
|
@@ -7136,7 +7139,7 @@ GEOTAGGING EXAMPLES
|
|
|
7136
7139
|
exiftool -geotag "tracks/*.log" -r dir
|
|
7137
7140
|
Read all track logs from the "tracks" directory.
|
|
7138
7141
|
|
|
7139
|
-
exiftool -p gpx.fmt
|
|
7142
|
+
exiftool -p gpx.fmt dir > out.gpx
|
|
7140
7143
|
Generate a GPX track log from all images in directory "dir". This
|
|
7141
7144
|
example uses the "gpx.fmt" file included in the full ExifTool
|
|
7142
7145
|
distribution package and assumes that the images in "dir" have all
|
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
# 2) The -ee3 option is to extract the full track from video files.
|
|
17
17
|
# 3) The -fileOrder option may be used to control the order of the
|
|
18
18
|
# generated track points when processing multiple files.
|
|
19
|
+
# 4) Coordinates are written at full resolution. To change this,
|
|
20
|
+
# remove the "#" from the GPSLatitude/Longitude tag names below
|
|
21
|
+
# and use the -c option to set the desired precision.
|
|
19
22
|
#------------------------------------------------------------------------------
|
|
20
23
|
#[HEAD]<?xml version="1.0" encoding="utf-8"?>
|
|
21
24
|
#[HEAD]<gpx version="1.0"
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
# 2) The -ee3 option is to extract the full track from video files.
|
|
18
18
|
# 3) The -fileOrder option may be used to control the order of the
|
|
19
19
|
# generated track points when processing multiple files.
|
|
20
|
+
# 4) Coordinates are written at full resolution. To change this,
|
|
21
|
+
# remove the "#" from the GPSLatitude/Longitude tag names below
|
|
22
|
+
# and use the -c option to set the desired precision.
|
|
20
23
|
#------------------------------------------------------------------------------
|
|
21
24
|
#[HEAD]<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
|
22
25
|
#[HEAD]<gpx version="1.1"
|
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
|
35
35
|
use Image::ExifTool::Validate;
|
|
36
36
|
use Image::ExifTool::MacOS;
|
|
37
37
|
|
|
38
|
-
$VERSION = '3.
|
|
38
|
+
$VERSION = '3.48';
|
|
39
39
|
@ISA = qw(Exporter);
|
|
40
40
|
|
|
41
41
|
sub NumbersFirst($$);
|
|
@@ -1324,9 +1324,12 @@ TagID: foreach $tagID (@keys) {
|
|
|
1324
1324
|
if ($writable) {
|
|
1325
1325
|
foreach ('PrintConv','ValueConv') {
|
|
1326
1326
|
next unless $$tagInfo{$_};
|
|
1327
|
-
next if $$tagInfo{$_ . 'Inv'};
|
|
1328
|
-
|
|
1329
|
-
|
|
1327
|
+
next if defined $$tagInfo{$_ . 'Inv'};
|
|
1328
|
+
# (undefined inverse conversion overrides hash lookup)
|
|
1329
|
+
unless (exists $$tagInfo{$_ . 'Inv'}) {
|
|
1330
|
+
next if ref($$tagInfo{$_}) =~ /^(HASH|ARRAY)$/;
|
|
1331
|
+
next if $$tagInfo{WriteAlso};
|
|
1332
|
+
}
|
|
1330
1333
|
if ($_ eq 'ValueConv') {
|
|
1331
1334
|
undef $writable;
|
|
1332
1335
|
} else {
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.60';
|
|
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)
|
|
@@ -605,15 +605,17 @@ $VERSION = '4.59';
|
|
|
605
605
|
'61182.27' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
|
|
606
606
|
'61182.28' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
|
|
607
607
|
'61182.29' => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
|
|
608
|
-
'61182.30' => 'Canon RF
|
|
609
|
-
'61182.31' => 'Canon RF
|
|
610
|
-
'61182.32' => 'Canon RF 400mm F2.8L IS USM
|
|
611
|
-
'61182.33' => 'Canon RF 400mm F2.8L IS USM +
|
|
612
|
-
'61182.34' => 'Canon RF
|
|
613
|
-
|
|
614
|
-
'61182.
|
|
615
|
-
|
|
616
|
-
'61182.37' => 'Canon RF
|
|
608
|
+
'61182.30' => 'Canon RF 24mm F1.8 MACRO IS STM', #42
|
|
609
|
+
'61182.31' => 'Canon RF 16mm F2.8 STM', #42
|
|
610
|
+
'61182.32' => 'Canon RF 400mm F2.8L IS USM', #IB
|
|
611
|
+
'61182.33' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
612
|
+
'61182.34' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
613
|
+
'61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
614
|
+
'61182.36' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
|
|
615
|
+
# we need the RFLensType values for the following...
|
|
616
|
+
'61182.37' => 'Canon RF 800mm F5.6L IS USM', #PH (NC)
|
|
617
|
+
'61182.38' => 'Canon RF 1200mm F8L IS USM', #PH (NC)
|
|
618
|
+
'61182.39' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
|
|
617
619
|
65535 => 'n/a',
|
|
618
620
|
);
|
|
619
621
|
|
|
@@ -6815,11 +6817,13 @@ my %ciMaxFocal = (
|
|
|
6815
6817
|
284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
|
|
6816
6818
|
285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
|
|
6817
6819
|
286 => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
|
|
6820
|
+
287 => 'Canon RF 24mm F1.8 MACRO IS STM', #42
|
|
6818
6821
|
288 => 'Canon RF 16mm F2.8 STM', #42
|
|
6819
6822
|
289 => 'Canon RF 400mm F2.8L IS USM', #IB
|
|
6820
6823
|
290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
6821
6824
|
291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
6822
6825
|
292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
6826
|
+
302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
|
|
6823
6827
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6824
6828
|
},
|
|
6825
6829
|
},
|
|
@@ -6864,6 +6868,7 @@ my %ciMaxFocal = (
|
|
|
6864
6868
|
8 => '4:5',
|
|
6865
6869
|
12 => '3:2 (APS-H crop)', #IB
|
|
6866
6870
|
13 => '3:2 (APS-C crop)', #IB
|
|
6871
|
+
258 => '4:3 crop', #PH (NC)
|
|
6867
6872
|
},
|
|
6868
6873
|
},
|
|
6869
6874
|
# (could use better names for these, or the Crop tags above, or both)
|
|
@@ -9393,8 +9398,9 @@ my %filterConv = (
|
|
|
9393
9398
|
# numbers from the previous image, so we need special logic
|
|
9394
9399
|
# to handle the FileIndex wrap properly)
|
|
9395
9400
|
$val[1] == 10000 and $val[1] = 1, ++$val[0];
|
|
9396
|
-
return sprintf("%.3d
|
|
9401
|
+
return sprintf("%.3d%.4d",@val);
|
|
9397
9402
|
},
|
|
9403
|
+
PrintConv => '$_=$val;s/(\d+)(\d{4})/$1-$2/;$_',
|
|
9398
9404
|
},
|
|
9399
9405
|
);
|
|
9400
9406
|
|
|
@@ -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.34';
|
|
27
27
|
|
|
28
28
|
sub ProcessCanonVRD($$;$);
|
|
29
29
|
sub WriteCanonVRD($$;$);
|
|
@@ -2046,17 +2046,16 @@ sub ProcessCanonVRD($$;$)
|
|
|
2046
2046
|
return 0;
|
|
2047
2047
|
}
|
|
2048
2048
|
}
|
|
2049
|
-
# exit quickly if writing and no CanonVRD tags are being edited
|
|
2050
|
-
if ($outfile and not exists $$et{EDIT_DIRS}{CanonVRD}) {
|
|
2051
|
-
print $out "$$et{INDENT} [nothing changed]\n" if $verbose;
|
|
2052
|
-
return 1 if $outfile eq $dataPt;
|
|
2053
|
-
return Write($outfile, $$dataPt) ? 1 : -1;
|
|
2054
|
-
}
|
|
2055
|
-
|
|
2056
2049
|
my $vrdType = 'VRD';
|
|
2057
2050
|
|
|
2058
2051
|
if ($outfile) {
|
|
2059
2052
|
$verbose and not $created and print $out " Rewriting CanonVRD trailer\n";
|
|
2053
|
+
# exit quickly if writing and no CanonVRD tags are being edited
|
|
2054
|
+
unless (exists $$et{EDIT_DIRS}{CanonVRD}) {
|
|
2055
|
+
print $out "$$et{INDENT} [nothing changed in CanonVRD]\n" if $verbose;
|
|
2056
|
+
return 1 if $outfile eq $dataPt;
|
|
2057
|
+
return Write($outfile, $$dataPt) ? 1 : -1;
|
|
2058
|
+
}
|
|
2060
2059
|
# delete CanonVRD information if specified
|
|
2061
2060
|
my $doDel = $$et{DEL_GROUP}{CanonVRD};
|
|
2062
2061
|
unless ($doDel) {
|
|
@@ -21,7 +21,7 @@ use strict;
|
|
|
21
21
|
use vars qw($VERSION);
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.18';
|
|
25
25
|
|
|
26
26
|
sub ProcessPEResources($$);
|
|
27
27
|
sub ProcessPEVersion($$);
|
|
@@ -1233,6 +1233,14 @@ sub ProcessEXE($$)
|
|
|
1233
1233
|
$tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO');
|
|
1234
1234
|
if ($1 eq "\xca\xfe\xba\xbe") {
|
|
1235
1235
|
SetByteOrder('MM');
|
|
1236
|
+
my $ver = Get32u(\$buff, 4);
|
|
1237
|
+
# Java bytecode .class files have the same magic number, so we need to look deeper
|
|
1238
|
+
# (ref https://github.com/file/file/blob/master/magic/Magdir/cafebabe#L6-L15)
|
|
1239
|
+
if ($ver > 30) {
|
|
1240
|
+
# this is Java bytecode
|
|
1241
|
+
$et->SetFileType('Java bytecode', 'application/java-byte-code', 'class');
|
|
1242
|
+
return 1;
|
|
1243
|
+
}
|
|
1236
1244
|
$et->SetFileType('Mach-O fat binary executable', undef, '');
|
|
1237
1245
|
return 1 if $fast3;
|
|
1238
1246
|
my $count = Get32u(\$buff, 4); # get architecture count
|
|
@@ -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.41';
|
|
60
60
|
|
|
61
61
|
sub ProcessExif($$$);
|
|
62
62
|
sub WriteExif($$$);
|
|
@@ -4842,10 +4842,10 @@ my %subSecConv = (
|
|
|
4842
4842
|
Writable => 1,
|
|
4843
4843
|
Protected => 1,
|
|
4844
4844
|
WriteAlso => {
|
|
4845
|
-
GPSLatitude => '$val =~ /(.*?)( ?[NS])?,/ ? $1 : undef',
|
|
4846
|
-
GPSLatitudeRef => '$val =~ /(-?)(.*?) ?([NS]?),/ ? ($3 || ($1 ? "S" : "N")) : undef',
|
|
4847
|
-
GPSLongitude => '$val =~ /, ?(.*?)( ?[EW]?)$/ ? $1 : undef',
|
|
4848
|
-
GPSLongitudeRef => '$val =~ /, ?(-?)(.*?) ?([EW]?)$/ ? ($3 || ($1 ? "W" : "E")) : undef',
|
|
4845
|
+
GPSLatitude => '(defined $val and $val =~ /(.*?)( ?[NS])?,/) ? $1 : undef',
|
|
4846
|
+
GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?) ?([NS]?),/) ? ($3 || ($1 ? "S" : "N")) : undef',
|
|
4847
|
+
GPSLongitude => '(defined $val and $val =~ /, ?(.*?)( ?[EW]?)$/) ? $1 : undef',
|
|
4848
|
+
GPSLongitudeRef => '(defined $val and $val =~ /, ?(-?)(.*?) ?([EW]?)$/) ? ($3 || ($1 ? "W" : "E")) : undef',
|
|
4849
4849
|
},
|
|
4850
4850
|
PrintConvInv => q{
|
|
4851
4851
|
return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
|
|
@@ -24,7 +24,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
24
24
|
use Image::ExifTool::Exif;
|
|
25
25
|
use Image::ExifTool::GPS;
|
|
26
26
|
|
|
27
|
-
$VERSION = '1.
|
|
27
|
+
$VERSION = '1.21';
|
|
28
28
|
|
|
29
29
|
sub ProcessFLIR($$;$);
|
|
30
30
|
sub ProcessFLIRText($$$);
|
|
@@ -99,7 +99,8 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
|
|
|
99
99
|
NOTES => q{
|
|
100
100
|
Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
|
|
101
101
|
images. These tags may also be extracted from the first frame of an FLIR
|
|
102
|
-
SEQ file, or all frames if the ExtractEmbedded option is used.
|
|
102
|
+
SEQ file, or all frames if the ExtractEmbedded option is used. Setting
|
|
103
|
+
ExtractEmbedded to 2 also the raw thermal data from all frames.
|
|
103
104
|
},
|
|
104
105
|
"_header" => {
|
|
105
106
|
Name => 'FFFHeader',
|
|
@@ -1551,7 +1552,7 @@ sub ProcessFLIR($$;$)
|
|
|
1551
1552
|
$$et{INDENT}, $i, $recType, $recPos, $recLen;
|
|
1552
1553
|
|
|
1553
1554
|
# skip RawData records for embedded documents
|
|
1554
|
-
if ($recType == 1 and $$et{DOC_NUM}) {
|
|
1555
|
+
if ($recType == 1 and $$et{DOC_NUM} and $et->Options('ExtractEmbedded') < 2) {
|
|
1555
1556
|
$raf->Seek($base+$recPos+$recLen) or $success = 0, last;
|
|
1556
1557
|
next;
|
|
1557
1558
|
}
|
|
@@ -369,7 +369,7 @@ my %coordConv = (
|
|
|
369
369
|
},
|
|
370
370
|
WriteAlso => {
|
|
371
371
|
'GPS:GPSLatitude' => '$val',
|
|
372
|
-
'GPS:GPSLatitudeRef' => '$val < 0 ? "S" : "N"',
|
|
372
|
+
'GPS:GPSLatitudeRef' => '(defined $val and $val < 0) ? "S" : "N"',
|
|
373
373
|
},
|
|
374
374
|
ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]',
|
|
375
375
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
|
@@ -386,7 +386,7 @@ my %coordConv = (
|
|
|
386
386
|
},
|
|
387
387
|
WriteAlso => {
|
|
388
388
|
'GPS:GPSLongitude' => '$val',
|
|
389
|
-
'GPS:GPSLongitudeRef' => '$val < 0 ? "W" : "E"',
|
|
389
|
+
'GPS:GPSLongitudeRef' => '(defined $val and $val < 0) ? "W" : "E"',
|
|
390
390
|
},
|
|
391
391
|
Require => {
|
|
392
392
|
0 => 'GPS:GPSLongitude',
|
|
@@ -25,7 +25,7 @@ use strict;
|
|
|
25
25
|
use vars qw($VERSION);
|
|
26
26
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
27
27
|
|
|
28
|
-
$VERSION = '1.
|
|
28
|
+
$VERSION = '1.40';
|
|
29
29
|
|
|
30
30
|
sub ProcessICC($$);
|
|
31
31
|
sub ProcessICC_Profile($$$);
|
|
@@ -815,6 +815,7 @@ my %manuSig = ( #6
|
|
|
815
815
|
Name => 'ChromaticityColorant',
|
|
816
816
|
Format => 'int16u',
|
|
817
817
|
PrintConv => {
|
|
818
|
+
0 => 'Unknown',
|
|
818
819
|
1 => 'ITU-R BT.709',
|
|
819
820
|
2 => 'SMPTE RP145-1994',
|
|
820
821
|
3 => 'EBU Tech.3213-E',
|
|
@@ -14,7 +14,7 @@ use strict;
|
|
|
14
14
|
use vars qw($VERSION);
|
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.12';
|
|
18
18
|
|
|
19
19
|
my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
20
20
|
|
|
@@ -27,8 +27,10 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
|
27
27
|
NOTES => q{
|
|
28
28
|
The following tags are extracted from Matroska multimedia container files.
|
|
29
29
|
This container format is used by file types such as MKA, MKV, MKS and WEBM.
|
|
30
|
-
For speed, ExifTool extracts tags only up to the first Cluster
|
|
31
|
-
L<Verbose|../ExifTool.html#Verbose> (-v)
|
|
30
|
+
For speed, by default ExifTool extracts tags only up to the first Cluster.
|
|
31
|
+
However, the L<Verbose|../ExifTool.html#Verbose> (-v) and L<Unknown|../ExifTool.html#Unknown> = 2 (-U) options force processing of
|
|
32
|
+
Cluster data, and the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option skips over Clusters to
|
|
33
|
+
read subsequent tags. See
|
|
32
34
|
L<http://www.matroska.org/technical/specs/index.html> for the official
|
|
33
35
|
Matroska specification.
|
|
34
36
|
},
|
|
@@ -269,10 +271,11 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
|
269
271
|
}
|
|
270
272
|
],
|
|
271
273
|
0x3314f => { Name => 'TrackTimecodeScale',Format => 'float' },
|
|
272
|
-
0x137f => { Name => 'TrackOffset',
|
|
274
|
+
0x137f => { Name => 'TrackOffset', Format => 'signed', Unknown => 1 },
|
|
273
275
|
0x15ee => { Name => 'MaxBlockAdditionID',Format => 'unsigned', Unknown => 1 },
|
|
274
|
-
0x136e => { Name => 'TrackName',
|
|
275
|
-
0x2b59c => { Name => 'TrackLanguage',
|
|
276
|
+
0x136e => { Name => 'TrackName', Format => 'utf8' },
|
|
277
|
+
0x2b59c => { Name => 'TrackLanguage', Format => 'string' },
|
|
278
|
+
0x2b59d => { Name => 'TrackLanguageIETF', Format => 'string' },
|
|
276
279
|
0x06 => [
|
|
277
280
|
{
|
|
278
281
|
Name => 'VideoCodecID',
|
|
@@ -743,7 +746,8 @@ sub ProcessMKV($$)
|
|
|
743
746
|
|
|
744
747
|
# set flag to process entire file (otherwise we stop at the first Cluster)
|
|
745
748
|
my $verbose = $et->Options('Verbose');
|
|
746
|
-
my $processAll = ($verbose or $et->Options('Unknown') > 1);
|
|
749
|
+
my $processAll = ($verbose or $et->Options('Unknown') > 1) ? 2 : 0;
|
|
750
|
+
++$processAll if $et->Options('ExtractEmbedded');
|
|
747
751
|
$$et{TrackTypes} = \%trackTypes; # store Track types reference
|
|
748
752
|
my $oldIndent = $$et{INDENT};
|
|
749
753
|
my $chapterNum = 0;
|
|
@@ -786,16 +790,20 @@ sub ProcessMKV($$)
|
|
|
786
790
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
|
|
787
791
|
# just fall through into the contained EBML elements
|
|
788
792
|
if ($tagInfo and $$tagInfo{SubDirectory}) {
|
|
789
|
-
# stop processing at first cluster unless we are
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
$$
|
|
796
|
-
$
|
|
793
|
+
# stop processing at first cluster unless we are using -v -U or -ee
|
|
794
|
+
if ($$tagInfo{Name} eq 'Cluster' and $processAll < 2) {
|
|
795
|
+
last unless $processAll;
|
|
796
|
+
undef $tagInfo; # just skip the Cluster when -ee is used
|
|
797
|
+
} else {
|
|
798
|
+
$$et{INDENT} .= '| ';
|
|
799
|
+
$et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
|
|
800
|
+
push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ];
|
|
801
|
+
if ($$tagInfo{Name} eq 'ChapterAtom') {
|
|
802
|
+
$$et{SET_GROUP1} = 'Chapter' . (++$chapterNum);
|
|
803
|
+
$trackIndent = $$et{INDENT};
|
|
804
|
+
}
|
|
805
|
+
next;
|
|
797
806
|
}
|
|
798
|
-
next;
|
|
799
807
|
}
|
|
800
808
|
last if $unknownSize;
|
|
801
809
|
if ($pos + $size > $dataLen) {
|
|
@@ -63,7 +63,7 @@ use Image::ExifTool::Exif;
|
|
|
63
63
|
use Image::ExifTool::GPS;
|
|
64
64
|
use Image::ExifTool::XMP;
|
|
65
65
|
|
|
66
|
-
$VERSION = '4.
|
|
66
|
+
$VERSION = '4.09';
|
|
67
67
|
|
|
68
68
|
sub LensIDConv($$$);
|
|
69
69
|
sub ProcessNikonAVI($$$);
|
|
@@ -1624,6 +1624,11 @@ my %base64coord = (
|
|
|
1624
1624
|
3 => 'Small',
|
|
1625
1625
|
},
|
|
1626
1626
|
},
|
|
1627
|
+
0x003f => { #https://github.com/darktable-org/darktable/issues/12282
|
|
1628
|
+
Name => 'WhiteBalanceFineTune',
|
|
1629
|
+
Writable => 'rational64s',
|
|
1630
|
+
Count => 2,
|
|
1631
|
+
},
|
|
1627
1632
|
0x0045 => { #IB
|
|
1628
1633
|
Name => 'CropArea',
|
|
1629
1634
|
Notes => 'left, top, width, height',
|
|
@@ -21,7 +21,7 @@ use vars qw($VERSION);
|
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
use Image::ExifTool::Exif;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.26';
|
|
25
25
|
|
|
26
26
|
sub ProcessJpgFromRaw($$$);
|
|
27
27
|
sub WriteJpgFromRaw($$$);
|
|
@@ -218,6 +218,7 @@ my %panasonicWhiteBalance = ( #forum9396
|
|
|
218
218
|
0x30 => { Name => 'CropLeft', Writable => 'int16u' },
|
|
219
219
|
0x31 => { Name => 'CropBottom', Writable => 'int16u' },
|
|
220
220
|
0x32 => { Name => 'CropRight', Writable => 'int16u' },
|
|
221
|
+
# 0x44 - may contain another pointer to the raw data starting at byte 2 in this data (DC-GH6)
|
|
221
222
|
0x10f => {
|
|
222
223
|
Name => 'Make',
|
|
223
224
|
Groups => { 2 => 'Camera' },
|
|
@@ -737,6 +738,7 @@ sub WriteDistortionInfo($$$)
|
|
|
737
738
|
# 2 - value count
|
|
738
739
|
# 3 - reference to list of original offset values
|
|
739
740
|
# 4 - IFD format number
|
|
741
|
+
# 5 - (pointer to StripOffsets value added by this PatchRawDataOffset routine)
|
|
740
742
|
sub PatchRawDataOffset($$$)
|
|
741
743
|
{
|
|
742
744
|
my ($offsetInfo, $raf, $ifd) = @_;
|
|
@@ -745,15 +747,26 @@ sub PatchRawDataOffset($$$)
|
|
|
745
747
|
my $rawDataOffset = $$offsetInfo{0x118};
|
|
746
748
|
my $err;
|
|
747
749
|
$err = 1 unless $ifd == 0;
|
|
748
|
-
|
|
749
|
-
|
|
750
|
+
if ($stripOffsets or $stripByteCounts) {
|
|
751
|
+
$err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
|
|
752
|
+
} else {
|
|
753
|
+
# the DC-GH6 and DC-GH5M2 write RawDataOffset with no Strip tags, so we need
|
|
754
|
+
# to create fake StripByteCounts information for copying the data
|
|
755
|
+
# (disable this until SilkyPix and Adobe utilities can deal with a variable
|
|
756
|
+
# RawDataOffset, see https://exiftool.org/forum/index.php?topic=13861.0 --
|
|
757
|
+
# so these files will continue to give a "No size tag" error when writing)
|
|
758
|
+
# $stripByteCounts = $$offsetInfo{0x117} = [ $PanasonicRaw::Main{0x117}, 0, 1, [ 0 ], 4 ];
|
|
759
|
+
}
|
|
760
|
+
if ($rawDataOffset and not $err) {
|
|
750
761
|
$err = 1 unless $$rawDataOffset[2] == 1;
|
|
751
|
-
$
|
|
762
|
+
if ($stripOffsets) {
|
|
763
|
+
$err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
|
|
764
|
+
}
|
|
752
765
|
}
|
|
753
766
|
$err and return 'Unsupported Panasonic/Leica RAW variant';
|
|
754
767
|
if ($rawDataOffset) {
|
|
755
768
|
# update StripOffsets along with this tag if it contains a reasonable value
|
|
756
|
-
|
|
769
|
+
if ($stripOffsets and $$stripOffsets[3][0] != 0xffffffff) {
|
|
757
770
|
# save pointer to StripOffsets value for updating later
|
|
758
771
|
push @$rawDataOffset, $$stripOffsets[1];
|
|
759
772
|
}
|
|
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
47
47
|
use Image::ExifTool::Exif;
|
|
48
48
|
use Image::ExifTool::GPS;
|
|
49
49
|
|
|
50
|
-
$VERSION = '2.
|
|
50
|
+
$VERSION = '2.76';
|
|
51
51
|
|
|
52
52
|
sub ProcessMOV($$;$);
|
|
53
53
|
sub ProcessKeys($$$);
|
|
@@ -556,12 +556,16 @@ my %eeBox2 = (
|
|
|
556
556
|
mdat => { Name => 'MediaData', Unknown => 1, Binary => 1 },
|
|
557
557
|
'mdat-size' => {
|
|
558
558
|
Name => 'MediaDataSize',
|
|
559
|
+
RawConv => '$$self{MediaDataSize} = $val',
|
|
559
560
|
Notes => q{
|
|
560
561
|
not a real tag ID, this tag represents the size of the 'mdat' data in bytes
|
|
561
562
|
and is used in the AvgBitrate calculation
|
|
562
563
|
},
|
|
563
564
|
},
|
|
564
|
-
'mdat-offset' =>
|
|
565
|
+
'mdat-offset' => {
|
|
566
|
+
Name => 'MediaDataOffset',
|
|
567
|
+
RawConv => '$$self{MediaDataOffset} = $val',
|
|
568
|
+
},
|
|
565
569
|
junk => { Unknown => 1, Binary => 1 }, #8
|
|
566
570
|
uuid => [
|
|
567
571
|
{ #9 (MP4 files)
|
|
@@ -897,7 +901,7 @@ my %eeBox2 = (
|
|
|
897
901
|
},
|
|
898
902
|
colr => {
|
|
899
903
|
Name => 'ColorRepresentation',
|
|
900
|
-
|
|
904
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
|
901
905
|
},
|
|
902
906
|
pasp => {
|
|
903
907
|
Name => 'PixelAspectRatio',
|
|
@@ -2732,7 +2736,7 @@ my %eeBox2 = (
|
|
|
2732
2736
|
},
|
|
2733
2737
|
},{
|
|
2734
2738
|
Name => 'ColorRepresentation',
|
|
2735
|
-
|
|
2739
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
|
2736
2740
|
}],
|
|
2737
2741
|
irot => {
|
|
2738
2742
|
Name => 'Rotation',
|
|
@@ -2792,6 +2796,78 @@ my %eeBox2 = (
|
|
|
2792
2796
|
},
|
|
2793
2797
|
);
|
|
2794
2798
|
|
|
2799
|
+
# ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
|
|
2800
|
+
%Image::ExifTool::QuickTime::ColorRep = (
|
|
2801
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
2802
|
+
GROUPS => { 2 => 'Video' },
|
|
2803
|
+
FIRST_ENTRY => 0,
|
|
2804
|
+
0 => { Name => 'ColorProfiles', Format => 'undef[4]' },
|
|
2805
|
+
4 => {
|
|
2806
|
+
Name => 'ColorPrimaries',
|
|
2807
|
+
Format => 'int16u',
|
|
2808
|
+
PrintConv => {
|
|
2809
|
+
1 => 'BT.709',
|
|
2810
|
+
2 => 'Unspecified',
|
|
2811
|
+
4 => 'BT.470 System M (historical)',
|
|
2812
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2813
|
+
6 => 'BT.601',
|
|
2814
|
+
7 => 'SMPTE 240',
|
|
2815
|
+
8 => 'Generic film (color filters using illuminant C)',
|
|
2816
|
+
9 => 'BT.2020, BT.2100',
|
|
2817
|
+
10 => 'SMPTE 428 (CIE 1921 XYZ)',
|
|
2818
|
+
11 => 'SMPTE RP 431-2',
|
|
2819
|
+
12 => 'SMPTE EG 432-1',
|
|
2820
|
+
22 => 'EBU Tech. 3213-E',
|
|
2821
|
+
},
|
|
2822
|
+
},
|
|
2823
|
+
6 => {
|
|
2824
|
+
Name => 'TransferCharacteristics',
|
|
2825
|
+
Format => 'int16u',
|
|
2826
|
+
PrintConv => {
|
|
2827
|
+
0 => 'For future use (0)',
|
|
2828
|
+
1 => 'BT.709',
|
|
2829
|
+
2 => 'Unspecified',
|
|
2830
|
+
3 => 'For future use (3)',
|
|
2831
|
+
4 => 'BT.470 System M (historical)',
|
|
2832
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2833
|
+
6 => 'BT.601',
|
|
2834
|
+
7 => 'SMPTE 240 M',
|
|
2835
|
+
8 => 'Linear',
|
|
2836
|
+
9 => 'Logarithmic (100 : 1 range)',
|
|
2837
|
+
10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
|
|
2838
|
+
11 => 'IEC 61966-2-4',
|
|
2839
|
+
12 => 'BT.1361',
|
|
2840
|
+
13 => 'sRGB or sYCC',
|
|
2841
|
+
14 => 'BT.2020 10-bit systems',
|
|
2842
|
+
15 => 'BT.2020 12-bit systems',
|
|
2843
|
+
16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
|
|
2844
|
+
17 => 'SMPTE ST 428',
|
|
2845
|
+
18 => 'BT.2100 HLG, ARIB STD-B67',
|
|
2846
|
+
},
|
|
2847
|
+
},
|
|
2848
|
+
8 => {
|
|
2849
|
+
Name => 'MatrixCoefficients',
|
|
2850
|
+
Format => 'int16u',
|
|
2851
|
+
PrintConv => {
|
|
2852
|
+
0 => 'Identity matrix',
|
|
2853
|
+
1 => 'BT.709',
|
|
2854
|
+
2 => 'Unspecified',
|
|
2855
|
+
3 => 'For future use (3)',
|
|
2856
|
+
4 => 'US FCC 73.628',
|
|
2857
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2858
|
+
6 => 'BT.601',
|
|
2859
|
+
7 => 'SMPTE 240 M',
|
|
2860
|
+
8 => 'YCgCo',
|
|
2861
|
+
9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
|
|
2862
|
+
10 => 'BT.2020 constant luminance',
|
|
2863
|
+
11 => 'SMPTE ST 2085 YDzDx',
|
|
2864
|
+
12 => 'Chromaticity-derived non-constant luminance',
|
|
2865
|
+
13 => 'Chromaticity-derived constant luminance',
|
|
2866
|
+
14 => 'BT.2100 ICtCp',
|
|
2867
|
+
},
|
|
2868
|
+
},
|
|
2869
|
+
);
|
|
2870
|
+
|
|
2795
2871
|
# HEVC configuration (ref https://github.com/MPEGGroup/isobmff/blob/master/IsoLib/libisomediafile/src/HEVCConfigAtom.c)
|
|
2796
2872
|
%Image::ExifTool::QuickTime::HEVCConfig = (
|
|
2797
2873
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -2811,9 +2811,9 @@ sub ScanMediaData($)
|
|
|
2811
2811
|
my ($pos, $buf2) = (0, '');
|
|
2812
2812
|
|
|
2813
2813
|
# don't rescan for freeGPS if we already found embedded metadata
|
|
2814
|
-
my $dataPos = $$et{
|
|
2814
|
+
my $dataPos = $$et{MediaDataOffset};
|
|
2815
2815
|
if ($dataPos and not $$et{DOC_COUNT}) {
|
|
2816
|
-
$dataLen = $$et{
|
|
2816
|
+
$dataLen = $$et{MediaDataSize};
|
|
2817
2817
|
if ($dataLen) {
|
|
2818
2818
|
if ($raf->Seek($dataPos, 0)) {
|
|
2819
2819
|
$$et{FreeGPS2} = { }; # initialize variable space for FreeGPS2()
|
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
34
34
|
use Image::ExifTool::Exif;
|
|
35
35
|
use Image::ExifTool::Minolta;
|
|
36
36
|
|
|
37
|
-
$VERSION = '3.
|
|
37
|
+
$VERSION = '3.52';
|
|
38
38
|
|
|
39
39
|
sub ProcessSRF($$$);
|
|
40
40
|
sub ProcessSR2($$$);
|
|
@@ -205,6 +205,7 @@ sub PrintInvLensSpec($;$$);
|
|
|
205
205
|
49468 => 'Tamron 18-300mm F3.5-6.3 Di III-A VC VXD', #JR (Model B061)
|
|
206
206
|
49469 => 'Tamron 35-150mm F2-F2.8 Di III VXD', #JR (Model A058)
|
|
207
207
|
49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
|
|
208
|
+
49471 => 'Tamron 50-400mm F4.5-6.3 Di III VC VXD', #JR (Model A067)
|
|
208
209
|
|
|
209
210
|
49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
|
|
210
211
|
49473.1 => 'Viltrox 23mm F1.4 E', #JR
|
|
@@ -4436,7 +4436,14 @@ my %tagLookup = (
|
|
|
4436
4436
|
'menubuttonreturn' => { 90 => 0xb },
|
|
4437
4437
|
'menumonitorofftime' => { 279 => '26.1', 280 => '22.1', 282 => '22.1', 283 => '22.1', 287 => '21.1', 288 => '8.2', 289 => '21.1', 292 => '22.1', 293 => '22.1', 294 => '22.1', 295 => 0x35 },
|
|
4438
4438
|
'menusettingsz7iioffset' => { 260 => 0xceb6 },
|
|
4439
|
+
'metadataauthority' => { 490 => 'metadataAuthority' },
|
|
4440
|
+
'metadataauthorityidentifier' => { 490 => [\'metadataAuthority','metadataAuthorityIdentifier'] },
|
|
4441
|
+
'metadataauthorityname' => { 490 => [\'metadataAuthority','metadataAuthorityName'] },
|
|
4439
4442
|
'metadatadate' => { 502 => 'MetadataDate' },
|
|
4443
|
+
'metadatalastedited' => { 490 => 'metadataLastEdited' },
|
|
4444
|
+
'metadatalasteditor' => { 490 => 'metadataLastEditor' },
|
|
4445
|
+
'metadatalasteditoridentifier' => { 490 => [\'metadataLastEditor','metadataLastEditorIdentifier'] },
|
|
4446
|
+
'metadatalasteditorname' => { 490 => [\'metadataLastEditor','metadataLastEditorName'] },
|
|
4440
4447
|
'metadatamoddate' => { 504 => 'metadataModDate' },
|
|
4441
4448
|
'metaversion' => { 428 => 0x34 },
|
|
4442
4449
|
'meterinfo1row1' => { 421 => 0x0, 422 => 0x0 },
|
|
@@ -5035,6 +5042,7 @@ my %tagLookup = (
|
|
|
5035
5042
|
'parametricshadows' => { 478 => 'ParametricShadows', 480 => 'ParametricShadows' },
|
|
5036
5043
|
'parametricshadowsplit' => { 478 => 'ParametricShadowSplit', 480 => 'ParametricShadowSplit' },
|
|
5037
5044
|
'parentalrating' => { 179 => 'WM/ParentalRating' },
|
|
5045
|
+
'parentid' => { 490 => 'parentId' },
|
|
5038
5046
|
'parentmediaeventid' => { 468 => 'ParentMediaEventID' },
|
|
5039
5047
|
'parentmeid' => { 468 => 'ParentMEID' },
|
|
5040
5048
|
'parentproductid' => { 372 => '@ppi' },
|
|
@@ -7036,7 +7044,7 @@ my %tagLookup = (
|
|
|
7036
7044
|
'whitebalancebuttonplaybackmode' => { 295 => 0x1c5 },
|
|
7037
7045
|
'whitebalancecomp' => { 305 => 0x1001 },
|
|
7038
7046
|
'whitebalancedetected' => { 138 => 0x3fb },
|
|
7039
|
-
'whitebalancefinetune' => { 127 => 0x100a, 184 => 0x38, 186 => 0x112, 226 => 0xb, 387 => 0x1004, 407 => 0x6, 408 => 0x5, 420 => 0x112 },
|
|
7047
|
+
'whitebalancefinetune' => { 127 => 0x100a, 184 => 0x38, 186 => 0x112, 226 => [0xb,0x3f], 387 => 0x1004, 407 => 0x6, 408 => 0x5, 420 => 0x112 },
|
|
7040
7048
|
'whitebalancemode' => { 138 => 0x3fa, 355 => 0x1a },
|
|
7041
7049
|
'whitebalancered' => { 74 => 0x6 },
|
|
7042
7050
|
'whitebalanceset' => { 336 => 0xa },
|
|
@@ -8008,6 +8016,7 @@ my %tagExists = (
|
|
|
8008
8016
|
'colorpalette' => 1,
|
|
8009
8017
|
'colorpopstrength' => 1,
|
|
8010
8018
|
'colorprimaries' => 1,
|
|
8019
|
+
'colorprofiles' => 1,
|
|
8011
8020
|
'colorresolutiondepth' => 1,
|
|
8012
8021
|
'colorresponseunit' => 1,
|
|
8013
8022
|
'colors' => 1,
|
|
@@ -9793,6 +9802,7 @@ my %tagExists = (
|
|
|
9793
9802
|
'marl' => 1,
|
|
9794
9803
|
'masksubarea' => 1,
|
|
9795
9804
|
'mastergainadjustment' => 1,
|
|
9805
|
+
'matrixcoefficients' => 1,
|
|
9796
9806
|
'matrixworldtocamera' => 1,
|
|
9797
9807
|
'matrixworldtoscreen' => 1,
|
|
9798
9808
|
'mattcolor' => 1,
|
|
@@ -11744,6 +11754,7 @@ my %tagExists = (
|
|
|
11744
11754
|
'trademark' => 1,
|
|
11745
11755
|
'transactionid' => 1,
|
|
11746
11756
|
'transfercharacteristic' => 1,
|
|
11757
|
+
'transfercharacteristics' => 1,
|
|
11747
11758
|
'transferrange' => 1,
|
|
11748
11759
|
'transfersequence' => 1,
|
|
11749
11760
|
'transformation' => 1,
|
|
@@ -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 25828 tags, with 16515 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
|
|
@@ -902,9 +902,9 @@ for the official EXIF 2.32 specification.
|
|
|
902
902
|
0xc71f RowInterleaveFactor - no
|
|
903
903
|
0xc725 ProfileLookTableDims IFD0 int32u[3]!
|
|
904
904
|
0xc726 ProfileLookTableData IFD0 float[n]!
|
|
905
|
-
0xc740 OpcodeList1 SubIFD undef
|
|
906
|
-
0xc741 OpcodeList2 SubIFD undef
|
|
907
|
-
0xc74e OpcodeList3 SubIFD undef
|
|
905
|
+
0xc740 OpcodeList1 SubIFD undef~!
|
|
906
|
+
0xc741 OpcodeList2 SubIFD undef~!
|
|
907
|
+
0xc74e OpcodeList3 SubIFD undef~!
|
|
908
908
|
0xc761 NoiseProfile SubIFD double[n]!
|
|
909
909
|
0xc763 TimeCodes IFD0 int8u[n]
|
|
910
910
|
0xc764 FrameRate IFD0 rational64s
|
|
@@ -4514,10 +4514,11 @@ These tags belong to the ExifTool XMP-iptcCore family 1 group.
|
|
|
4514
4514
|
|
|
4515
4515
|
=head3 XMP iptcExt Tags
|
|
4516
4516
|
|
|
4517
|
-
This table contains tags defined by the IPTC Extension schema version 1.6
|
|
4518
|
-
|
|
4519
|
-
the family 1 group name. (
|
|
4520
|
-
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>
|
|
4517
|
+
This table contains tags defined by the IPTC Extension schema version 1.6
|
|
4518
|
+
and IPTC Video Metadata version 1.3. The actual namespace prefix is
|
|
4519
|
+
"Iptc4xmpExt", but ExifTool shortens this for the family 1 group name. (See
|
|
4520
|
+
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/> and
|
|
4521
|
+
L<https://iptc.org/standards/video-metadata-hub/>.)
|
|
4521
4522
|
|
|
4522
4523
|
These tags belong to the ExifTool XMP-iptcExt family 1 group.
|
|
4523
4524
|
|
|
@@ -4655,9 +4656,17 @@ These tags belong to the ExifTool XMP-iptcExt family 1 group.
|
|
|
4655
4656
|
LocationShownWorldRegion string_+
|
|
4656
4657
|
MaxAvailHeight integer
|
|
4657
4658
|
MaxAvailWidth integer
|
|
4659
|
+
MetadataAuthority Entity Struct
|
|
4660
|
+
MetadataAuthorityIdentifier string_+
|
|
4661
|
+
MetadataAuthorityName lang-alt_
|
|
4662
|
+
MetadataLastEdited date
|
|
4663
|
+
MetadataLastEditor Entity Struct
|
|
4664
|
+
MetadataLastEditorIdentifier string_+
|
|
4665
|
+
MetadataLastEditorName lang-alt_
|
|
4658
4666
|
ModelAge integer+
|
|
4659
4667
|
OrganisationInImageCode string+
|
|
4660
4668
|
OrganisationInImageName string+
|
|
4669
|
+
ParentID string
|
|
4661
4670
|
PersonHeard Entity Struct+
|
|
4662
4671
|
PersonHeardIdentifier string_+
|
|
4663
4672
|
PersonHeardName lang-alt_+
|
|
@@ -10720,7 +10729,8 @@ imaging cameras by FLIR Systems Inc.
|
|
|
10720
10729
|
|
|
10721
10730
|
Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
|
|
10722
10731
|
images. These tags may also be extracted from the first frame of an FLIR
|
|
10723
|
-
SEQ file, or all frames if the ExtractEmbedded option is used.
|
|
10732
|
+
SEQ file, or all frames if the ExtractEmbedded option is used. Setting
|
|
10733
|
+
ExtractEmbedded to 2 also the raw thermal data from all frames.
|
|
10724
10734
|
|
|
10725
10735
|
Tag ID Tag Name Writable
|
|
10726
10736
|
------ -------- --------
|
|
@@ -13506,6 +13516,7 @@ DiMAGE X and Xt.
|
|
|
13506
13516
|
0x0039 LocationInfo Nikon LocationInfo
|
|
13507
13517
|
0x003d BlackLevel int16u[4]
|
|
13508
13518
|
0x003e ImageSizeRAW yes
|
|
13519
|
+
0x003f WhiteBalanceFineTune rational64s[2]
|
|
13509
13520
|
0x0045 CropArea int16u[4]
|
|
13510
13521
|
0x004e NikonSettings NikonSettings
|
|
13511
13522
|
0x004f ColorTemperatureAuto int16u
|
|
@@ -28359,7 +28370,7 @@ and are not currently writable.
|
|
|
28359
28370
|
'av1C' AV1Configuration QuickTime AV1Config
|
|
28360
28371
|
'clap' CleanAperture no
|
|
28361
28372
|
'colr' ICC_Profile ICC_Profile
|
|
28362
|
-
ColorRepresentation
|
|
28373
|
+
ColorRepresentation QuickTime ColorRep
|
|
28363
28374
|
'hvcC' HEVCConfiguration QuickTime HEVCConfig
|
|
28364
28375
|
'irot' Rotation int8u!
|
|
28365
28376
|
'ispe' ImageSpatialExtent no
|
|
@@ -28381,6 +28392,15 @@ and are not currently writable.
|
|
|
28381
28392
|
2.4 ChromaSamplePosition no
|
|
28382
28393
|
3 InitialDelaySamples? no
|
|
28383
28394
|
|
|
28395
|
+
=head3 QuickTime ColorRep Tags
|
|
28396
|
+
|
|
28397
|
+
Index1 Tag Name Writable
|
|
28398
|
+
------ -------- --------
|
|
28399
|
+
0 ColorProfiles no
|
|
28400
|
+
4 ColorPrimaries no
|
|
28401
|
+
6 TransferCharacteristics no
|
|
28402
|
+
8 MatrixCoefficients no
|
|
28403
|
+
|
|
28384
28404
|
=head3 QuickTime HEVCConfig Tags
|
|
28385
28405
|
|
|
28386
28406
|
Index1 Tag Name Writable
|
|
@@ -28721,7 +28741,7 @@ Child atoms found in "sinf" and/or "pinf" atoms.
|
|
|
28721
28741
|
'avcC' AVCConfiguration? no
|
|
28722
28742
|
'btrt' BitrateInfo QuickTime Bitrate
|
|
28723
28743
|
'clap' CleanAperture QuickTime CleanAperture
|
|
28724
|
-
'colr' ColorRepresentation
|
|
28744
|
+
'colr' ColorRepresentation QuickTime ColorRep
|
|
28725
28745
|
'fiel' VideoFieldOrder no
|
|
28726
28746
|
'gama' Gamma no
|
|
28727
28747
|
'pasp' PixelAspectRatio no
|
|
@@ -29480,8 +29500,10 @@ ARCore accelerometer data.
|
|
|
29480
29500
|
|
|
29481
29501
|
The following tags are extracted from Matroska multimedia container files.
|
|
29482
29502
|
This container format is used by file types such as MKA, MKV, MKS and WEBM.
|
|
29483
|
-
For speed, ExifTool extracts tags only up to the first Cluster
|
|
29484
|
-
Verbose (-v)
|
|
29503
|
+
For speed, by default ExifTool extracts tags only up to the first Cluster.
|
|
29504
|
+
However, the Verbose (-v) and Unknown = 2 (-U) options force processing of
|
|
29505
|
+
Cluster data, and the ExtractEmbedded (-ee) option skips over Clusters to
|
|
29506
|
+
read subsequent tags. See
|
|
29485
29507
|
L<http://www.matroska.org/technical/specs/index.html> for the official
|
|
29486
29508
|
Matroska specification.
|
|
29487
29509
|
|
|
@@ -29663,6 +29685,7 @@ Matroska specification.
|
|
|
29663
29685
|
0x3eb5 Signature? no
|
|
29664
29686
|
0x7670 Projection Matroska Projection
|
|
29665
29687
|
0x2b59c TrackLanguage no
|
|
29688
|
+
0x2b59d TrackLanguageIETF no
|
|
29666
29689
|
0x3314f TrackTimecodeScale no
|
|
29667
29690
|
0x383e3 FrameRate no
|
|
29668
29691
|
0x3e383 VideoFrameRate no
|
|
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
|
|
|
17
17
|
use strict;
|
|
18
18
|
use vars qw($VERSION %exifSpec);
|
|
19
19
|
|
|
20
|
-
$VERSION = '1.
|
|
20
|
+
$VERSION = '1.19';
|
|
21
21
|
|
|
22
22
|
use Image::ExifTool qw(:Utils);
|
|
23
23
|
use Image::ExifTool::Exif;
|
|
@@ -82,8 +82,8 @@ my %otherSpec = (
|
|
|
82
82
|
CR2 => { 0xc5d8 => 1, 0xc5d9 => 1, 0xc5e0 => 1, 0xc640 => 1, 0xc6dc => 1, 0xc6dd => 1 },
|
|
83
83
|
NEF => { 0x9216 => 1, 0x9217 => 1 },
|
|
84
84
|
DNG => { 0x882a => 1, 0x9211 => 1, 0x9216 => 1 },
|
|
85
|
-
ARW => { 0x7000 => 1, 0x7001 => 1, 0x7010 => 1, 0x7011 => 1, 0x7020 => 1,
|
|
86
|
-
|
|
85
|
+
ARW => { 0x7000 => 1, 0x7001 => 1, 0x7010 => 1, 0x7011 => 1, 0x7020 => 1, 0x7031 => 1,
|
|
86
|
+
0x7032 => 1, 0x7034 => 1, 0x7035 => 1, 0x7036 => 1, 0x7037 => 1, 0x7038 => 1,
|
|
87
87
|
0x7310 => 1, 0x7313 => 1, 0x7316 => 1, 0x74c7 => 1, 0x74c8 => 1, 0xa500 => 1 },
|
|
88
88
|
RW2 => { All => 1 }, # ignore all unknown tags in RW2
|
|
89
89
|
RWL => { All => 1 },
|
|
@@ -586,7 +586,7 @@ sub WriteExif($$$)
|
|
|
586
586
|
$et->Error("$str $name directory", 1);
|
|
587
587
|
}
|
|
588
588
|
}
|
|
589
|
-
my ($index, $dirEnd, $numEntries);
|
|
589
|
+
my ($index, $dirEnd, $numEntries, %hasOldID, $unsorted);
|
|
590
590
|
if ($dirStart + 4 < $dataLen) {
|
|
591
591
|
$numEntries = Get16u($dataPt, $dirStart);
|
|
592
592
|
$dirEnd = $dirStart + 2 + 12 * $numEntries;
|
|
@@ -596,19 +596,20 @@ sub WriteExif($$$)
|
|
|
596
596
|
return undef unless $n and defined $rtn;
|
|
597
597
|
$numEntries = $n; # continue processing the entries we have
|
|
598
598
|
}
|
|
599
|
-
#
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
599
|
+
# create lookup for existing tag ID's and determine if directory is sorted
|
|
600
|
+
my $lastID = -1;
|
|
601
|
+
for ($index=0; $index<$numEntries; ++$index) {
|
|
602
|
+
my $tagID = Get16u($dataPt, $dirStart + 2 + 12 * $index);
|
|
603
|
+
$hasOldID{$tagID} = 1;
|
|
604
|
+
# check for proper sequence (but ignore null entries at end)
|
|
605
|
+
$unsorted = 1 if $tagID < $lastID and ($tagID or $$tagTablePtr{0});
|
|
606
|
+
$lastID = $tagID;
|
|
607
|
+
}
|
|
608
|
+
# sort entries if out-of-order (but not in maker notes IFDs or RAW files)
|
|
609
|
+
if ($unsorted and not ($inMakerNotes or $et->IsRawType())) {
|
|
610
|
+
SortIFD($dataPt, $dirStart, $numEntries, $$tagTablePtr{0});
|
|
611
|
+
$et->Warn("Entries in $name were out of sequence. Fixed.",1);
|
|
612
|
+
$unsorted = 0;
|
|
612
613
|
}
|
|
613
614
|
} else {
|
|
614
615
|
$numEntries = 0;
|
|
@@ -616,11 +617,12 @@ sub WriteExif($$$)
|
|
|
616
617
|
}
|
|
617
618
|
|
|
618
619
|
# loop through new values and accumulate all information for this IFD
|
|
619
|
-
my (%set, %mayDelete, $tagInfo);
|
|
620
|
+
my (%set, %mayDelete, $tagInfo, %hasNewID);
|
|
620
621
|
my $wrongDir = $crossDelete{$dirName};
|
|
621
622
|
my @newTagInfo = $et->GetNewTagInfoList($tagTablePtr);
|
|
622
623
|
foreach $tagInfo (@newTagInfo) {
|
|
623
624
|
my $tagID = $$tagInfo{TagID};
|
|
625
|
+
$hasNewID{$tagID} = 1;
|
|
624
626
|
# must evaluate Condition later when we have all DataMember's available
|
|
625
627
|
$set{$tagID} = (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) ? '' : $tagInfo;
|
|
626
628
|
}
|
|
@@ -972,7 +974,7 @@ Entry: for (;;) {
|
|
|
972
974
|
$readCount = $oldSize / $formatSize[$readFormat];
|
|
973
975
|
}
|
|
974
976
|
}
|
|
975
|
-
if ($oldID <= $lastTagID and not $inMakerNotes) {
|
|
977
|
+
if ($oldID <= $lastTagID and not ($inMakerNotes or $et->IsRawType())) {
|
|
976
978
|
my $str = $oldInfo ? "$$oldInfo{Name} tag" : sprintf('tag 0x%x',$oldID);
|
|
977
979
|
if ($oldID == $lastTagID) {
|
|
978
980
|
$et->Warn("Duplicate $str in $name");
|
|
@@ -1006,6 +1008,23 @@ Entry: for (;;) {
|
|
|
1006
1008
|
}
|
|
1007
1009
|
} else {
|
|
1008
1010
|
$isNew = $oldID <=> $newID;
|
|
1011
|
+
# special logic needed if directory has out-of-order entries
|
|
1012
|
+
if ($unsorted and $isNew) {
|
|
1013
|
+
if ($isNew > 0 and $hasOldID{$newID}) {
|
|
1014
|
+
# we wanted to create the new tag, but an old tag
|
|
1015
|
+
# does exist with this ID, so defer writing the new tag
|
|
1016
|
+
$isNew = -1;
|
|
1017
|
+
}
|
|
1018
|
+
if ($isNew < 0 and $hasNewID{$oldID}) {
|
|
1019
|
+
# we wanted to write the old tag, but we have
|
|
1020
|
+
# a new tag with this ID, so move it up in the order
|
|
1021
|
+
my @tmpTags = ( $oldID );
|
|
1022
|
+
$_ == $oldID or push @tmpTags, $_ foreach @newTags;
|
|
1023
|
+
@newTags = @tmpTags;
|
|
1024
|
+
$newID = $oldID;
|
|
1025
|
+
$isNew = 0;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1009
1028
|
}
|
|
1010
1029
|
my $newInfo = $oldInfo;
|
|
1011
1030
|
my $newFormat = $oldFormat;
|
|
@@ -2170,17 +2189,39 @@ NoOverwrite: next if $isNew > 0;
|
|
|
2170
2189
|
my @offsetList;
|
|
2171
2190
|
if ($ifd >= 0) {
|
|
2172
2191
|
my $offsetInfo = $offsetInfo[$ifd] or next;
|
|
2192
|
+
if ($$offsetInfo{0x111} and $$offsetInfo{0x144}) {
|
|
2193
|
+
# SubIFD may contain double-referenced data as both strips and tiles
|
|
2194
|
+
# for Sony ARW files when SonyRawFileType is "Lossless Compressed RAW 2"
|
|
2195
|
+
if ($dirName eq 'SubIFD' and $$et{TIFF_TYPE} eq 'ARW' and
|
|
2196
|
+
$$offsetInfo{0x117} and $$offsetInfo{0x145} and
|
|
2197
|
+
$$offsetInfo{0x111}[2]==1) # (must be a single strip or the tile offsets could get out of sync)
|
|
2198
|
+
{
|
|
2199
|
+
# some Sony ARW images contain double-referenced raw data stored as both strips
|
|
2200
|
+
# and tiles. Copy the data using only the strip tags, but store the TileOffets
|
|
2201
|
+
# information for updating later (see PanasonicRaw:PatchRawDataOffset for a
|
|
2202
|
+
# description of offsetInfo elements)
|
|
2203
|
+
$$offsetInfo{0x111}[5] = $$offsetInfo{0x144}; # hack to save TileOffsets
|
|
2204
|
+
# delete tile information from offsetInfo because we will copy as strips
|
|
2205
|
+
delete $$offsetInfo{0x144};
|
|
2206
|
+
delete $$offsetInfo{0x145};
|
|
2207
|
+
} else {
|
|
2208
|
+
$et->Error("TIFF $dirName contains both strip and tile data");
|
|
2209
|
+
}
|
|
2210
|
+
}
|
|
2173
2211
|
# patch Panasonic RAW/RW2 StripOffsets/StripByteCounts if necessary
|
|
2174
2212
|
my $stripOffsets = $$offsetInfo{0x111};
|
|
2175
|
-
|
|
2213
|
+
my $rawDataOffset = $$offsetInfo{0x118};
|
|
2214
|
+
if ($stripOffsets and $$stripOffsets[0]{PanasonicHack} or
|
|
2215
|
+
$rawDataOffset and $$rawDataOffset[0]{PanasonicHack})
|
|
2216
|
+
{
|
|
2176
2217
|
require Image::ExifTool::PanasonicRaw;
|
|
2177
2218
|
my $err = Image::ExifTool::PanasonicRaw::PatchRawDataOffset($offsetInfo, $raf, $ifd);
|
|
2178
2219
|
$err and $et->Error($err);
|
|
2179
2220
|
}
|
|
2180
2221
|
my $tagID;
|
|
2181
|
-
# loop through all tags in reverse order so we save thumbnail
|
|
2222
|
+
# loop through all tags in reverse numerical order so we save thumbnail
|
|
2182
2223
|
# data before main image data if both exist in the same IFD
|
|
2183
|
-
foreach $tagID (reverse sort keys %$offsetInfo) {
|
|
2224
|
+
foreach $tagID (reverse sort { $a <=> $b } keys %$offsetInfo) {
|
|
2184
2225
|
my $tagInfo = $$offsetInfo{$tagID}[0];
|
|
2185
2226
|
next unless $$tagInfo{IsOffset}; # handle byte counts with offsets
|
|
2186
2227
|
my $sizeInfo = $$offsetInfo{$$tagInfo{OffsetPair}};
|
|
@@ -2406,10 +2447,28 @@ NoOverwrite: next if $isNew > 0;
|
|
|
2406
2447
|
# also add to subIfdDataFixup if necessary
|
|
2407
2448
|
$subIfdDataFixup->AddFixup($offsetPos, $dataTag) if $subIfdDataFixup;
|
|
2408
2449
|
# must also (sometimes) update StripOffsets in Panasonic RW2 images
|
|
2450
|
+
# and TileOffsets in Sony ARW images
|
|
2409
2451
|
my $otherPos = $$offsetPair[0][5];
|
|
2410
|
-
if ($otherPos
|
|
2411
|
-
|
|
2412
|
-
|
|
2452
|
+
if ($otherPos) {
|
|
2453
|
+
if ($$tagInfo{PanasonicHack}) {
|
|
2454
|
+
Set32u($newOffset, \$newData, $otherPos);
|
|
2455
|
+
$fixup->AddFixup($otherPos, $dataTag);
|
|
2456
|
+
} elsif (ref $otherPos eq 'ARRAY') {
|
|
2457
|
+
# the image data was copied as one large strip, and is double-referenced
|
|
2458
|
+
# as tile data, so all we need to do now is properly update the tile offsets
|
|
2459
|
+
my $oldRawDataOffset = $$offsetPair[0][3][0];
|
|
2460
|
+
my $count = $$otherPos[2];
|
|
2461
|
+
my $i;
|
|
2462
|
+
# point to offsets in value data if more than one pointer
|
|
2463
|
+
$$otherPos[1] = Get32u(\$newData, $$otherPos[1]) if $count > 1;
|
|
2464
|
+
for ($i=0; $i<$count; ++$i) {
|
|
2465
|
+
my $oldTileOffset = $$otherPos[3][$i];
|
|
2466
|
+
my $ptrPos = $$otherPos[1] + 4 * $i;
|
|
2467
|
+
Set32u($newOffset + $oldTileOffset - $oldRawDataOffset, \$newData, $ptrPos);
|
|
2468
|
+
$fixup->AddFixup($ptrPos, $dataTag);
|
|
2469
|
+
$subIfdDataFixup->AddFixup($ptrPos, $dataTag) if $subIfdDataFixup;
|
|
2470
|
+
}
|
|
2471
|
+
}
|
|
2413
2472
|
}
|
|
2414
2473
|
if ($ifd >= 0) {
|
|
2415
2474
|
# buff length must be even (Note: may have changed since $size was set)
|
|
@@ -334,13 +334,9 @@ sub DoWriteIPTC($$$)
|
|
|
334
334
|
# - improves speed
|
|
335
335
|
# - avoids changing current MD5 digest unnecessarily
|
|
336
336
|
# - avoids adding mandatory tags unless some other IPTC is changed
|
|
337
|
-
unless
|
|
337
|
+
return undef unless exists $$et{EDIT_DIRS}{$$dirInfo{DirName}} or
|
|
338
338
|
# standard IPTC tags in other locations should be edited too (eg. AFCP_IPTC)
|
|
339
|
-
($tagTablePtr eq \%Image::ExifTool::IPTC::Main and exists $$et{EDIT_DIRS}{IPTC})
|
|
340
|
-
{
|
|
341
|
-
print $out "$$et{INDENT} [nothing changed]\n" if $verbose;
|
|
342
|
-
return undef;
|
|
343
|
-
}
|
|
339
|
+
($tagTablePtr eq \%Image::ExifTool::IPTC::Main and exists $$et{EDIT_DIRS}{IPTC});
|
|
344
340
|
my $dataPt = $$dirInfo{DataPt};
|
|
345
341
|
unless ($dataPt) {
|
|
346
342
|
my $emptyData = '';
|
|
@@ -4242,7 +4242,10 @@ sub WriteDirectory($$$;$)
|
|
|
4242
4242
|
$$self{DIR_NAME} = $oldDir;
|
|
4243
4243
|
@$self{'Compression','SubfileType'} = @save;
|
|
4244
4244
|
SetByteOrder($saveOrder);
|
|
4245
|
-
|
|
4245
|
+
if ($out) {
|
|
4246
|
+
print $out " Deleting $name\n" if defined $newData and not length $newData;
|
|
4247
|
+
print $out "$$self{INDENT} [nothing changed in $dirName]\n" if $$self{CHANGED} == $oldChanged;
|
|
4248
|
+
}
|
|
4246
4249
|
return $newData;
|
|
4247
4250
|
}
|
|
4248
4251
|
|
|
@@ -4531,7 +4534,7 @@ sub DumpUnknownTrailer($$)
|
|
|
4531
4534
|
# add to Preview block list if valid and in the trailer
|
|
4532
4535
|
$image{$prePos} = [$tag, $preLen] if $prePos and $preLen and $prePos+$preLen > $pos;
|
|
4533
4536
|
last if $lastOne; # checked all images
|
|
4534
|
-
# look for MPF images (in the
|
|
4537
|
+
# look for MPF images (in the proper order)
|
|
4535
4538
|
++$mpImageNum;
|
|
4536
4539
|
$prePos = $$self{VALUE}{"MPImageStart ($mpImageNum)"};
|
|
4537
4540
|
if (defined $prePos) {
|
|
@@ -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.52';
|
|
54
54
|
@ISA = qw(Exporter);
|
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
|
56
56
|
|
|
@@ -3447,8 +3447,12 @@ NoLoop:
|
|
|
3447
3447
|
} else {
|
|
3448
3448
|
$val = ConvertXMPDate($val, $new) if $new or $fmt eq 'date';
|
|
3449
3449
|
}
|
|
3450
|
-
if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean') {
|
|
3451
|
-
$
|
|
3450
|
+
if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean' and $val!~/^True|False$/) {
|
|
3451
|
+
if ($val =~ /^true|false$/) {
|
|
3452
|
+
$et->WarnOnce("Boolean value for XMP-$ns:$$tagInfo{Name} should be capitalized",1);
|
|
3453
|
+
} else {
|
|
3454
|
+
$et->WarnOnce(qq(Boolean value for XMP-$ns:$$tagInfo{Name} should be "True" or "False"),1);
|
|
3455
|
+
}
|
|
3452
3456
|
}
|
|
3453
3457
|
# protect against large binary data in unknown tags
|
|
3454
3458
|
$$tagInfo{Binary} = 1 if $new and length($val) > 65536;
|
|
@@ -538,10 +538,11 @@ my %sImageRegion = ( # new in 1.5
|
|
|
538
538
|
NAMESPACE => 'Iptc4xmpExt',
|
|
539
539
|
TABLE_DESC => 'XMP IPTC Extension',
|
|
540
540
|
NOTES => q{
|
|
541
|
-
This table contains tags defined by the IPTC Extension schema version 1.6
|
|
542
|
-
|
|
543
|
-
the family 1 group name. (
|
|
544
|
-
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>
|
|
541
|
+
This table contains tags defined by the IPTC Extension schema version 1.6
|
|
542
|
+
and IPTC Video Metadata version 1.3. The actual namespace prefix is
|
|
543
|
+
"Iptc4xmpExt", but ExifTool shortens this for the family 1 group name. (See
|
|
544
|
+
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/> and
|
|
545
|
+
L<https://iptc.org/standards/video-metadata-hub/>.)
|
|
545
546
|
},
|
|
546
547
|
AboutCvTerm => {
|
|
547
548
|
Struct => \%sCVTermDetails,
|
|
@@ -796,6 +797,12 @@ my %sImageRegion = ( # new in 1.5
|
|
|
796
797
|
},
|
|
797
798
|
PlanningRef => { List => 'Bag', Struct => \%sEntityWithRole },
|
|
798
799
|
audioBitsPerSample => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
|
|
800
|
+
# new IPTC video metadata 1.3 properties
|
|
801
|
+
# (ref https://iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.3.html)
|
|
802
|
+
metadataLastEdited => { Groups => { 2 => 'Time' }, %dateTimeInfo },
|
|
803
|
+
metadataLastEditor => { Struct => \%sEntity },
|
|
804
|
+
metadataAuthority => { Struct => \%sEntity },
|
|
805
|
+
parentId => { Name => 'ParentID' },
|
|
799
806
|
# new IPTC Extension schema 1.5 property
|
|
800
807
|
ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
|
|
801
808
|
# new Extension 1.6 property
|
|
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
|
30
30
|
%static_vars);
|
|
31
31
|
|
|
32
|
-
$VERSION = '12.
|
|
32
|
+
$VERSION = '12.45';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -638,11 +638,12 @@ XMP to be extracted.
|
|
|
638
638
|
|
|
639
639
|
Flag to extract information from embedded documents in EPS files, embedded
|
|
640
640
|
EPS information and JPEG and Jpeg2000 images in PDF files, embedded MPF
|
|
641
|
-
images in JPEG and MPO files,
|
|
642
|
-
fork of Mac OS files.
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
any unlisted program containing
|
|
641
|
+
images in JPEG and MPO files, metadata after the first Cluster in MKV files,
|
|
642
|
+
timed metadata in videos, and the resource fork of Mac OS files. A setting
|
|
643
|
+
of 2 also causes the H264 video stream in MP4 files to be parsed until the
|
|
644
|
+
first SEI message is decoded, or 3 to parse the entire H264 stream in MP4
|
|
645
|
+
videos and the entire M2TS file to look for any unlisted program containing
|
|
646
|
+
GPS metadata. Default is undef.
|
|
646
647
|
|
|
647
648
|
=item FastScan
|
|
648
649
|
|