exiftool_vendored 13.08.0 → 13.10.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 +27 -2
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +25 -12
- data/bin/lib/Image/ExifTool/Apple.pm +9 -7
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +8 -0
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +80 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +2 -2
- data/bin/lib/Image/ExifTool/PNG.pm +2 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +1 -0
- data/bin/lib/Image/ExifTool/QuickTime.pm +49 -10
- data/bin/lib/Image/ExifTool/TagLookup.pm +3 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +23 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +43 -9
- data/bin/lib/Image/ExifTool/Writer.pl +16 -5
- data/bin/lib/Image/ExifTool.pm +8 -5
- data/bin/lib/Image/ExifTool.pod +41 -35
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bd6e60c5e63b9f1c5c19ec9ecff2c388dbb148125958da2dc032788523a6f1b
|
4
|
+
data.tar.gz: 0ca3fe31d4880779349339e560485d5780f9568a100ed3b2e66c1bf0d1d556ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36c2edb4757ce9a9a1311d4688ceba8da4b9529c1f193cf1e7c70634295e980d93fc68a133d3d5079d9f359dbe2b4efb53a05cf2f5ea5e09b6a4b469ff02a435
|
7
|
+
data.tar.gz: 0e977d49e4c994eac82d4e1c2525f30c95112513cc7bc620256f3788d550b4d294681aa36183c49f0bae1ded85b1bce9beba097025d0ecbb88df5774a610a652
|
data/bin/Changes
CHANGED
@@ -4,15 +4,40 @@ ExifTool Version History
|
|
4
4
|
|
5
5
|
RSS feed: https://exiftool.org/rss.xml
|
6
6
|
|
7
|
-
Note: The most recent production release is Version 13.
|
7
|
+
Note: The most recent production release is Version 13.10. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Dec. 20, 2024 - Version 13.10 (production release)
|
11
|
+
|
12
|
+
- Added warnings for out-of-order entries in 'iinf' and 'ipma' boxes of HEIC
|
13
|
+
images
|
14
|
+
- Added support for date/time formatting codes %f and %z in the inverse
|
15
|
+
print conversion when writing tags
|
16
|
+
- Updated Geolocation databases from current geonames.org files
|
17
|
+
- Improved verbose output to show values stored with construction method 1 in
|
18
|
+
MP4-based files
|
19
|
+
- Enhanced the date/time timezone format specifier %z so that %:z returns the
|
20
|
+
time zone with a colon separator (eg. "-05:00")
|
21
|
+
- Fixed bug where the existing tag wasn't being removed when writing a new
|
22
|
+
value for an Unknown QuickTime UserData or ItemList tag
|
23
|
+
|
24
|
+
Dec. 17, 2024 - Version 13.09
|
25
|
+
|
26
|
+
- Added a new QuickTime tag (thanks Matti)
|
27
|
+
- Added a missing format check on a few tags when writing
|
28
|
+
- Decode a couple of new ICC_Profile tags
|
29
|
+
- Patched HEIC writer so newly added XMP or EXIF refers to the 'tmap' item as
|
30
|
+
well as the primary item of an HDRGainMap image (since iPhone 15 and 16 do
|
31
|
+
it this way)
|
32
|
+
- Fixed compatibility issue where Apple Preview would no longer show the gain
|
33
|
+
map image after adding new XMP to an HEIC with an HDR gain map
|
34
|
+
|
10
35
|
Dec. 14, 2024 - Version 13.08
|
11
36
|
|
12
37
|
- Decode ShutterCount for Canon EOS R6 Mark II (thanks Agoston Kapitany)
|
13
38
|
- Decode a few new Photoshop tags
|
14
39
|
- Suppress all duplicate Warning tags and add count to end of message
|
15
|
-
- Changed format of bitmask keys in -
|
40
|
+
- Changed format of bitmask keys in -listx output
|
16
41
|
- Internal streamlining of LIGOGPSINFO decoding
|
17
42
|
- Fixed issue where some tags were incorrectly shown as writable in -listx
|
18
43
|
output
|
data/bin/MANIFEST
CHANGED
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
109
109
|
terminal window to extract and run ExifTool:
|
110
110
|
|
111
111
|
cd ~/Desktop
|
112
|
-
gzip -dc Image-ExifTool-13.
|
113
|
-
cd Image-ExifTool-13.
|
112
|
+
gzip -dc Image-ExifTool-13.10.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-13.10
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
115
115
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use warnings;
|
12
12
|
require 5.004;
|
13
13
|
|
14
|
-
my $version = '13.
|
14
|
+
my $version = '13.10';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -5644,16 +5644,29 @@ in the delimiter. Default is ','.
|
|
5644
5644
|
|
5645
5645
|
Set the format for date/time tag values. The I<FMT> string may contain
|
5646
5646
|
formatting codes beginning with a percent character (C<%>) to represent the
|
5647
|
-
various components of a date/time value.
|
5648
|
-
|
5649
|
-
|
5650
|
-
|
5651
|
-
|
5652
|
-
|
5653
|
-
|
5654
|
-
|
5655
|
-
|
5656
|
-
|
5647
|
+
various components of a date/time value. ExifTool implements 3 format codes
|
5648
|
+
internally (see below), but other format codes are system dependent --
|
5649
|
+
consult the C<strftime> man page on your system for details. The default
|
5650
|
+
format is equivalent to "%Y:%m:%d %H:%M:%S". This option has no effect on
|
5651
|
+
date-only or time-only tags. Requires POSIX::strptime or Time::Piece for
|
5652
|
+
the inversion conversion when writing. Only one B<-d> option may be used
|
5653
|
+
per command.
|
5654
|
+
|
5655
|
+
Additional format codes implemented internally by ExifTool:
|
5656
|
+
|
5657
|
+
1) C<%z> represents the time zone in "+/-HHMM" format. Adding a colon (ie.
|
5658
|
+
C<%:z>) adds a colon separator (eg. "-05:00"). If the date/time value
|
5659
|
+
doesn't contain a time zone then C<%z> gives the system time zone for the
|
5660
|
+
specified date/time value.
|
5661
|
+
|
5662
|
+
2) C<%f> represents fractional seconds, and supports an optional width to
|
5663
|
+
specify the number of digits after the decimal point (eg. C<%3f> would give
|
5664
|
+
something like ".437"). Adding a minus sign drops the decimal point (eg.
|
5665
|
+
C<%-3f> would give "437").
|
5666
|
+
|
5667
|
+
3) C<%s> represents the number of seconds since 00:00 UTC Jan 1, 1970,
|
5668
|
+
taking into account the specified time zone (or system time zone if not
|
5669
|
+
specified).
|
5657
5670
|
|
5658
5671
|
=item B<-D> (B<-decimal>)
|
5659
5672
|
|
@@ -5913,7 +5926,7 @@ with this command:
|
|
5913
5926
|
|
5914
5927
|
produces output like this:
|
5915
5928
|
|
5916
|
-
-- Generated by ExifTool 13.
|
5929
|
+
-- Generated by ExifTool 13.10 --
|
5917
5930
|
File: a.jpg - 2003:10:31 15:44:19
|
5918
5931
|
(f/5.6, 1/60s, ISO 100)
|
5919
5932
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -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.14';
|
20
20
|
|
21
21
|
sub ConvertPLIST($$);
|
22
22
|
|
@@ -291,12 +291,12 @@ sub ConvertPLIST($$);
|
|
291
291
|
# 0x0047 - (LeaderFollowerAutoFocusLeaderDepth, ref 2)
|
292
292
|
# 0x0048 - (LeaderFollowerAutoFocusLeaderFocusMethod, ref 2)
|
293
293
|
# 0x0049 - (LeaderFollowerAutoFocusLeaderConfidence, ref 2)
|
294
|
-
#
|
294
|
+
# 0x004a - (LeaderFollowerAutoFocusLeaderROIType, ref 2)
|
295
295
|
# 0x004a - 2=back normal, 4=back wide angle, 5=front (ref PH)
|
296
|
-
#
|
297
|
-
#
|
298
|
-
#
|
299
|
-
#
|
296
|
+
# 0x004b - (ZeroShutterLagFailureReason, ref 2)
|
297
|
+
# 0x004c - (TimeOfFlightAssistedAutoFocusEstimatorMSPMeasuredDepth, ref 2)
|
298
|
+
# 0x004d - (TimeOfFlightAssistedAutoFocusEstimatorMSPSensorConfidence, ref 2)
|
299
|
+
# 0x004e - (Camera, ref 2)
|
300
300
|
0x004e => {
|
301
301
|
Name => 'Apple_0x004e',
|
302
302
|
Unknown => 1,
|
@@ -358,7 +358,8 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Apple');
|
|
358
358
|
sub ConvertPLIST($$)
|
359
359
|
{
|
360
360
|
my ($val, $et) = @_;
|
361
|
-
my $dirInfo = { DataPt => \$val };
|
361
|
+
my $dirInfo = { DataPt => \$val, NoVerboseDir => 1 };
|
362
|
+
my $oldOrder = $et->GetByteOrder();
|
362
363
|
require Image::ExifTool::PLIST;
|
363
364
|
Image::ExifTool::PLIST::ProcessBinaryPLIST($et, $dirInfo);
|
364
365
|
$val = $$dirInfo{Value};
|
@@ -366,6 +367,7 @@ sub ConvertPLIST($$)
|
|
366
367
|
require 'Image/ExifTool/XMPStruct.pl';
|
367
368
|
$val = Image::ExifTool::XMP::SerializeStruct($et, $val);
|
368
369
|
}
|
370
|
+
$et->SetByteOrder($oldOrder);
|
369
371
|
return $val;
|
370
372
|
}
|
371
373
|
|
@@ -866,6 +866,11 @@ sub new
|
|
866
866
|
}
|
867
867
|
$noID = 1 if $isXMP or $short =~ /^(Shortcuts|ASF.*)$/ or $$vars{NO_ID};
|
868
868
|
$hexID = $$vars{HEX_ID};
|
869
|
+
if ($$table{WRITE_PROC} and $$table{WRITE_PROC} eq \&Image::ExifTool::WriteBinaryData
|
870
|
+
and not $$table{CHECK_PROC})
|
871
|
+
{
|
872
|
+
warn("Binary table $tableName doesn't have a CHECK_PROC\n");
|
873
|
+
}
|
869
874
|
my $processBinaryData = ($$table{PROCESS_PROC} and (
|
870
875
|
$$table{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData or
|
871
876
|
$$table{PROCESS_PROC} eq \&Image::ExifTool::Nikon::ProcessNikonEncrypted or
|
@@ -1004,6 +1009,9 @@ TagID: foreach $tagID (@keys) {
|
|
1004
1009
|
if ($writable and not ($$table{WRITE_PROC} or $tableName =~ /Shortcuts/ or $writable eq '2')) {
|
1005
1010
|
undef $writable;
|
1006
1011
|
}
|
1012
|
+
#if ($writable and $$tagInfo{Unknown} and $$table{GROUPS}{0} ne 'MakerNotes') {
|
1013
|
+
# warn "Warning: Writable Unknown tag - $short $name\n",
|
1014
|
+
#}
|
1007
1015
|
# validate some characteristics of obvious date/time tags
|
1008
1016
|
my @g = $et->GetGroup($tagInfo);
|
1009
1017
|
if ($$tagInfo{List} and $g[2] eq 'Time' and $writable and not $$tagInfo{Protected} and
|
Binary file
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
|
13
13
|
# 6) Eef Vreeland private communication
|
14
14
|
# 7) https://color.org/specification/ICC.2-2019.pdf
|
15
|
+
# 8) https://www.color.org/specification/ICC.1-2022-05.pdf
|
15
16
|
#
|
16
17
|
# Notes: The ICC profile information is different: the format of each
|
17
18
|
# tag is embedded in the information instead of in the directory
|
@@ -25,7 +26,7 @@ use strict;
|
|
25
26
|
use vars qw($VERSION);
|
26
27
|
use Image::ExifTool qw(:DataAccess :Utils);
|
27
28
|
|
28
|
-
$VERSION = '1.
|
29
|
+
$VERSION = '1.41';
|
29
30
|
|
30
31
|
sub ProcessICC($$);
|
31
32
|
sub ProcessICC_Profile($$$);
|
@@ -367,6 +368,7 @@ my %manuSig = ( #6
|
|
367
368
|
Groups => { 2 => 'Time' },
|
368
369
|
PrintConv => '$self->ConvertDateTime($val)',
|
369
370
|
},
|
371
|
+
|
370
372
|
targ => {
|
371
373
|
Name => 'CharTarget',
|
372
374
|
ValueConv => '$val=~s/\0.*//; length $val > 128 ? \$val : $val',
|
@@ -493,6 +495,10 @@ my %manuSig = ( #6
|
|
493
495
|
},
|
494
496
|
},
|
495
497
|
ciis => 'ColorimetricIntentImageState', #5
|
498
|
+
cicp => { #8 (Coding-independent Code Points)
|
499
|
+
Name => 'ColorRepresentation',
|
500
|
+
SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::ColorRep' },
|
501
|
+
},
|
496
502
|
scoe => 'SceneColorimetryEstimates', #5
|
497
503
|
sape => 'SceneAppearanceEstimates', #5
|
498
504
|
fpce => 'FocalPlaneColorimetryEstimates', #5
|
@@ -628,6 +634,7 @@ my %manuSig = ( #6
|
|
628
634
|
s2cp => 'StandardToCustomPcc',
|
629
635
|
smap => 'SurfaceMap',
|
630
636
|
# smwp ? (seen in some v5 samples [was a mistake in sample production])
|
637
|
+
hdgm => { Name => 'HDGainMapInfo', Binary => 1 }, #PH
|
631
638
|
|
632
639
|
# the following entry represents the ICC profile header, and doesn't
|
633
640
|
# exist as a tag in the directory. It is only in this table to provide
|
@@ -747,6 +754,78 @@ my %manuSig = ( #6
|
|
747
754
|
},
|
748
755
|
);
|
749
756
|
|
757
|
+
# Coding-independent code points (cicp) definition
|
758
|
+
# (NOTE: conversions are the same as Image::ExifTool::QuickTime::ColorRep tags)
|
759
|
+
%Image::ExifTool::ICC_Profile::ColorRep = (
|
760
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
761
|
+
GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-cicp', 2 => 'Image' },
|
762
|
+
8 => {
|
763
|
+
Name => 'ColorPrimaries',
|
764
|
+
PrintConv => {
|
765
|
+
1 => 'BT.709',
|
766
|
+
2 => 'Unspecified',
|
767
|
+
4 => 'BT.470 System M (historical)',
|
768
|
+
5 => 'BT.470 System B, G (historical)',
|
769
|
+
6 => 'BT.601',
|
770
|
+
7 => 'SMPTE 240',
|
771
|
+
8 => 'Generic film (color filters using illuminant C)',
|
772
|
+
9 => 'BT.2020, BT.2100',
|
773
|
+
10 => 'SMPTE 428 (CIE 1931 XYZ)', #forum14766
|
774
|
+
11 => 'SMPTE RP 431-2',
|
775
|
+
12 => 'SMPTE EG 432-1',
|
776
|
+
22 => 'EBU Tech. 3213-E',
|
777
|
+
},
|
778
|
+
},
|
779
|
+
9 => {
|
780
|
+
Name => 'TransferCharacteristics',
|
781
|
+
PrintConv => {
|
782
|
+
0 => 'For future use (0)',
|
783
|
+
1 => 'BT.709',
|
784
|
+
2 => 'Unspecified',
|
785
|
+
3 => 'For future use (3)',
|
786
|
+
4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
|
787
|
+
5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
|
788
|
+
6 => 'BT.601',
|
789
|
+
7 => 'SMPTE 240 M',
|
790
|
+
8 => 'Linear',
|
791
|
+
9 => 'Logarithmic (100 : 1 range)',
|
792
|
+
10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
|
793
|
+
11 => 'IEC 61966-2-4',
|
794
|
+
12 => 'BT.1361',
|
795
|
+
13 => 'sRGB or sYCC',
|
796
|
+
14 => 'BT.2020 10-bit systems',
|
797
|
+
15 => 'BT.2020 12-bit systems',
|
798
|
+
16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
|
799
|
+
17 => 'SMPTE ST 428',
|
800
|
+
18 => 'BT.2100 HLG, ARIB STD-B67',
|
801
|
+
},
|
802
|
+
},
|
803
|
+
10 => {
|
804
|
+
Name => 'MatrixCoefficients',
|
805
|
+
PrintConv => {
|
806
|
+
0 => 'Identity matrix',
|
807
|
+
1 => 'BT.709',
|
808
|
+
2 => 'Unspecified',
|
809
|
+
3 => 'For future use (3)',
|
810
|
+
4 => 'US FCC 73.628',
|
811
|
+
5 => 'BT.470 System B, G (historical)',
|
812
|
+
6 => 'BT.601',
|
813
|
+
7 => 'SMPTE 240 M',
|
814
|
+
8 => 'YCgCo',
|
815
|
+
9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
|
816
|
+
10 => 'BT.2020 constant luminance',
|
817
|
+
11 => 'SMPTE ST 2085 YDzDx',
|
818
|
+
12 => 'Chromaticity-derived non-constant luminance',
|
819
|
+
13 => 'Chromaticity-derived constant luminance',
|
820
|
+
14 => 'BT.2100 ICtCp',
|
821
|
+
},
|
822
|
+
},
|
823
|
+
11 => {
|
824
|
+
Name => 'VideoFullRangeFlag',
|
825
|
+
PrintConv => { 0 => 'Limited', 1 => 'Full' },
|
826
|
+
},
|
827
|
+
);
|
828
|
+
|
750
829
|
# viewingConditionsType (view) definition
|
751
830
|
%Image::ExifTool::ICC_Profile::ViewingConditions = (
|
752
831
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.43';
|
20
20
|
|
21
21
|
sub ProcessJpeg2000Box($$$);
|
22
22
|
sub ProcessJUMD($$$);
|
@@ -631,6 +631,7 @@ my %j2cMarker = (
|
|
631
631
|
%Image::ExifTool::Jpeg2000::ColorSpec = (
|
632
632
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
633
633
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, # (we don't actually call this)
|
634
|
+
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
634
635
|
GROUPS => { 2 => 'Image' },
|
635
636
|
FORMAT => 'int8s',
|
636
637
|
WRITABLE => 1,
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
use Image::ExifTool::XMP;
|
22
22
|
use Image::ExifTool::GPS;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.13';
|
25
25
|
|
26
26
|
sub ExtractObject($$;$);
|
27
27
|
sub Get24u($$);
|
@@ -344,7 +344,7 @@ sub ProcessBinaryPLIST($$;$)
|
|
344
344
|
my ($i, $buff, @table);
|
345
345
|
my $dataPt = $$dirInfo{DataPt};
|
346
346
|
|
347
|
-
$et->VerboseDir('Binary PLIST');
|
347
|
+
$et->VerboseDir('Binary PLIST') unless $$dirInfo{NoVerboseDir};
|
348
348
|
SetByteOrder('MM');
|
349
349
|
|
350
350
|
if ($dataPt) {
|
@@ -36,7 +36,7 @@ use strict;
|
|
36
36
|
use vars qw($VERSION $AUTOLOAD %stdCase);
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
38
38
|
|
39
|
-
$VERSION = '1.
|
39
|
+
$VERSION = '1.70';
|
40
40
|
|
41
41
|
sub ProcessPNG_tEXt($$$);
|
42
42
|
sub ProcessPNG_iTXt($$$);
|
@@ -435,6 +435,7 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
|
|
435
435
|
%Image::ExifTool::PNG::PhysicalPixel = (
|
436
436
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
437
437
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
|
438
|
+
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
438
439
|
WRITABLE => 1,
|
439
440
|
GROUPS => { 1 => 'PNG-pHYs', 2 => 'Image' },
|
440
441
|
WRITE_GROUP => 'PNG-pHYs',
|
@@ -362,6 +362,7 @@ my %unicodeString = (
|
|
362
362
|
PROCESS_PROC => \&ProcessChannelOptions,
|
363
363
|
VARS => { IS_BINARY => 1 },
|
364
364
|
GROUPS => { 2 => 'Image' },
|
365
|
+
NOTES => 'These tags relate only to the appearance of a channel.',
|
365
366
|
0 => {
|
366
367
|
Name => 'ChannelColorSpace',
|
367
368
|
Format => 'int16u',
|
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
48
48
|
use Image::ExifTool::Exif;
|
49
49
|
use Image::ExifTool::GPS;
|
50
50
|
|
51
|
-
$VERSION = '3.
|
51
|
+
$VERSION = '3.07';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -2222,8 +2222,8 @@ my %userDefined = (
|
|
2222
2222
|
_cx_ => { Name => 'CX', Format => 'rational64s', Unknown => 1 },
|
2223
2223
|
_cy_ => { Name => 'CY', Format => 'rational64s', Unknown => 1 },
|
2224
2224
|
rads => { Name => 'Rads', Format => 'rational64s', Unknown => 1 },
|
2225
|
-
lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess)
|
2226
|
-
Lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess)
|
2225
|
+
lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess, Kodak proprietary)
|
2226
|
+
Lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess, Kodak proprietary)
|
2227
2227
|
pose => { Name => 'pose', SubDirectory => { TagTable => 'Image::ExifTool::Kodak::pose' } },
|
2228
2228
|
# AMBA => Ambarella AVC atom (unknown data written by Kodak Playsport video cam)
|
2229
2229
|
# tmlp - 1 byte: 0 (PixPro SP360/4KVR360)
|
@@ -2822,7 +2822,7 @@ my %userDefined = (
|
|
2822
2822
|
},
|
2823
2823
|
iinf => [{
|
2824
2824
|
Name => 'ItemInformation',
|
2825
|
-
Condition => '$$valPt =~ /^\0/', # (check for version 0)
|
2825
|
+
Condition => '$$self{LastItemID} = -1; $$valPt =~ /^\0/', # (check for version 0)
|
2826
2826
|
SubDirectory => {
|
2827
2827
|
TagTable => 'Image::ExifTool::QuickTime::ItemInfo',
|
2828
2828
|
Start => 6, # (4-byte version/flags + 2-byte count)
|
@@ -2894,6 +2894,17 @@ my %userDefined = (
|
|
2894
2894
|
%unknownInfo,
|
2895
2895
|
},
|
2896
2896
|
],
|
2897
|
+
grpl => {
|
2898
|
+
Name => 'Unknown_grpl',
|
2899
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::grpl' },
|
2900
|
+
},
|
2901
|
+
);
|
2902
|
+
|
2903
|
+
# unknown grpl container
|
2904
|
+
%Image::ExifTool::QuickTime::grpl = (
|
2905
|
+
PROCESS_PROC => \&ProcessMOV,
|
2906
|
+
GROUPS => { 2 => 'Video' },
|
2907
|
+
# altr - seen "00 00 00 00 00 00 00 41 00 00 00 02 00 00 00 42 00 00 00 2e"
|
2897
2908
|
);
|
2898
2909
|
|
2899
2910
|
# additional metadata container (ref ISO14496-12:2015)
|
@@ -3038,6 +3049,7 @@ my %userDefined = (
|
|
3038
3049
|
);
|
3039
3050
|
|
3040
3051
|
# ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
|
3052
|
+
# (NOTE: conversions are the same as Image::ExifTool::ICC_Profile::ColorRep tags)
|
3041
3053
|
%Image::ExifTool::QuickTime::ColorRep = (
|
3042
3054
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
3043
3055
|
GROUPS => { 2 => 'Video' },
|
@@ -3321,7 +3333,13 @@ my %userDefined = (
|
|
3321
3333
|
the associations between items in the file. This information is used by
|
3322
3334
|
ExifTool, but these entries are not extracted as tags.
|
3323
3335
|
},
|
3324
|
-
dimg => {
|
3336
|
+
dimg => {
|
3337
|
+
Name => 'DerivedImageRef',
|
3338
|
+
# also parse these for the ID of the primary 'tmap' item
|
3339
|
+
# (tone-mapped image in HDRGainMap HEIC by iPhone 15 and 16)
|
3340
|
+
RawConv => \&ParseContentDescribes,
|
3341
|
+
WriteHook => \&ParseContentDescribes,
|
3342
|
+
},
|
3325
3343
|
thmb => { Name => 'ThumbnailRef', RawConv => 'undef' },
|
3326
3344
|
auxl => { Name => 'AuxiliaryImageRef', RawConv => 'undef' },
|
3327
3345
|
cdsc => {
|
@@ -3339,7 +3357,8 @@ my %userDefined = (
|
|
3339
3357
|
# hvc1 - HEVC image
|
3340
3358
|
# lhv1 - L-HEVC image
|
3341
3359
|
# infe - ItemInformationEntry
|
3342
|
-
# infe types: avc1,hvc1,lhv1,Exif,xml1,iovl(overlay image),grid,mime,hvt1(tile image)
|
3360
|
+
# infe types: avc1,hvc1,lhv1,Exif,xml1,iovl(overlay image),grid,mime,tmap,hvt1(tile image)
|
3361
|
+
# ('tmap' has something to do with the new gainmap written by iPhone 15 and 16)
|
3343
3362
|
infe => {
|
3344
3363
|
Name => 'ItemInfoEntry',
|
3345
3364
|
RawConv => \&ParseItemInfoEntry,
|
@@ -6569,7 +6588,7 @@ my %userDefined = (
|
|
6569
6588
|
PROCESS_PROC => \&ProcessKeys,
|
6570
6589
|
WRITE_PROC => \&WriteKeys,
|
6571
6590
|
CHECK_PROC => \&CheckQTValue,
|
6572
|
-
VARS => { LONG_TAGS =>
|
6591
|
+
VARS => { LONG_TAGS => 9 },
|
6573
6592
|
WRITABLE => 1,
|
6574
6593
|
# (not PREFERRED when writing)
|
6575
6594
|
GROUPS => { 1 => 'Keys' },
|
@@ -6767,6 +6786,7 @@ my %userDefined = (
|
|
6767
6786
|
ValueConv => 'unpack("N", $val)',
|
6768
6787
|
Writable => 0, # (don't make this writable because it is found in timed metadata)
|
6769
6788
|
},
|
6789
|
+
'full-frame-rate-playback-intent' => 'FullFrameRatePlaybackIntent', #forum16824
|
6770
6790
|
#
|
6771
6791
|
# seen in Apple ProRes RAW file
|
6772
6792
|
#
|
@@ -8787,6 +8807,7 @@ sub PrintableTagID($;$)
|
|
8787
8807
|
# ContentType - mime type of item
|
8788
8808
|
# ContentEncoding - item encoding
|
8789
8809
|
# URI - URI of a 'uri '-type item
|
8810
|
+
# infe - raw data for 'infe' box (when writing only) [retracted]
|
8790
8811
|
# ipma:
|
8791
8812
|
# Association - list of associated properties in the ipco container
|
8792
8813
|
# Essential - list of "essential" flags for the associated properties
|
@@ -8937,10 +8958,18 @@ sub ParseItemInfoEntry($$)
|
|
8937
8958
|
$$items{$id}{URI} = GetString(\$val, $pos);
|
8938
8959
|
}
|
8939
8960
|
}
|
8961
|
+
#[retracted] # save raw infe box when writing in case we need to sort items later
|
8962
|
+
#[retracted] $$items{$id}{infe} = pack('N', length($val)+8) . 'infe' . $val if $$et{IsWriting};
|
8940
8963
|
$et->VPrint(1, "$$et{INDENT} Item $id: Type=", $$items{$id}{Type} || '',
|
8941
8964
|
' Name=', $$items{$id}{Name} || '',
|
8942
8965
|
' ContentType=', $$items{$id}{ContentType} || '',
|
8966
|
+
($$et{PrimaryItem} and $$et{PrimaryItem} == $id) ? ' (PrimaryItem)' : '',
|
8943
8967
|
"\n") if $verbose > 1;
|
8968
|
+
unless ($id > $$et{LastItemID}) {
|
8969
|
+
$et->Warn('Item info entries are out of order'); #[retracted] unless $$et{IsWriting};
|
8970
|
+
#[retracted] $$et{ItemsNotSorted} = 1; # set flag indicating the items weren't sorted
|
8971
|
+
}
|
8972
|
+
$$et{LastItemID} = $id;
|
8944
8973
|
return undef;
|
8945
8974
|
}
|
8946
8975
|
|
@@ -8961,6 +8990,7 @@ sub ParseItemPropAssoc($$)
|
|
8961
8990
|
my $flg = Get32u(\$val, 0);
|
8962
8991
|
my $num = Get32u(\$val, 4);
|
8963
8992
|
my $pos = 8;
|
8993
|
+
my $lastID = -1;
|
8964
8994
|
for ($i=0; $i<$num; ++$i) {
|
8965
8995
|
if ($ver == 0) {
|
8966
8996
|
return undef if $pos + 3 > $len;
|
@@ -8993,6 +9023,9 @@ sub ParseItemPropAssoc($$)
|
|
8993
9023
|
$$items{$id}{Association} = \@association;
|
8994
9024
|
$$items{$id}{Essential} = \@essential;
|
8995
9025
|
$et->VPrint(1, "$$et{INDENT} Item $id properties: @association\n") if $verbose > 1;
|
9026
|
+
# (according to ISO/IEC 23008-12, these entries must be sorted by item ID)
|
9027
|
+
$et->Warn('Item property association entries are out of order') unless $id > $lastID;
|
9028
|
+
$lastID = $id;
|
8996
9029
|
}
|
8997
9030
|
return undef;
|
8998
9031
|
}
|
@@ -9039,7 +9072,10 @@ sub HandleItemInfo($)
|
|
9039
9072
|
}
|
9040
9073
|
}
|
9041
9074
|
$warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
|
9042
|
-
|
9075
|
+
# Note: In HEIC's, these seem to indicate data in 'idat' instead of 'mdat'
|
9076
|
+
my $constMeth = $$item{ConstructionMethod} || 0;
|
9077
|
+
$warn = "Can't currently extract $type with construction method $constMeth" if $constMeth > 1;
|
9078
|
+
$warn = "No 'idat' for $type object with construction method 1" if $constMeth == 1 and not $$et{MediaDataInfo};
|
9043
9079
|
$et->Warn($warn) if $warn and $name;
|
9044
9080
|
$warn = 'Not this file' if $$item{DataReferenceIndex}; # (can only extract from "this file")
|
9045
9081
|
unless (($$item{Extents} and @{$$item{Extents}}) or $warn) {
|
@@ -9050,7 +9086,7 @@ sub HandleItemInfo($)
|
|
9050
9086
|
$et->VPrint(0, "$$et{INDENT} [not extracted] ($warn)\n") if $verbose > 2;
|
9051
9087
|
next;
|
9052
9088
|
}
|
9053
|
-
my $base = $$item{BaseOffset} || 0;
|
9089
|
+
my $base = ($$item{BaseOffset} || 0) + ($constMeth ? $$et{MediaDataInfo}[0] : 0);
|
9054
9090
|
if ($verbose > 2) {
|
9055
9091
|
# do verbose hex dump
|
9056
9092
|
my $len = 0;
|
@@ -9189,6 +9225,7 @@ sub HandleItemInfo($)
|
|
9189
9225
|
delete $$et{DOC_NUM};
|
9190
9226
|
}
|
9191
9227
|
delete $$et{ItemInfo};
|
9228
|
+
delete $$et{MediaDataInfo};
|
9192
9229
|
}
|
9193
9230
|
|
9194
9231
|
#------------------------------------------------------------------------------
|
@@ -9771,8 +9808,10 @@ sub ProcessMOV($$;$)
|
|
9771
9808
|
# save required tag sizes
|
9772
9809
|
if ($$tagTablePtr{"$tag-size"}) {
|
9773
9810
|
$et->HandleTag($tagTablePtr, "$tag-size", $size);
|
9774
|
-
$et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
|
9811
|
+
$et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()+$dirBase) if $$tagTablePtr{"$tag-offset"};
|
9775
9812
|
}
|
9813
|
+
# save position/size of 'idat'
|
9814
|
+
$$et{MediaDataInfo} = [ $raf->Tell() + $dirBase, $size ] if $tag eq 'idat';
|
9776
9815
|
# stop processing at mdat/idat if -fast2 is used
|
9777
9816
|
last if $fast > 1 and ($tag eq 'mdat' or ($tag eq 'idat' and $$et{FileType} ne 'HEIC'));
|
9778
9817
|
# load values only if associated with a tag (or verbose) and not too big
|
@@ -3261,6 +3261,7 @@ my %tagLookup = (
|
|
3261
3261
|
'fujiflashmode' => { 133 => 0x1010 },
|
3262
3262
|
'fujimodel' => { 133 => 0x1447 },
|
3263
3263
|
'fujimodel2' => { 133 => 0x1448 },
|
3264
|
+
'fullframerateplaybackintent' => { 409 => 'full-frame-rate-playback-intent' },
|
3264
3265
|
'fullhdhighspeedrec' => { 133 => 0x3824 },
|
3265
3266
|
'fullimagesize' => { 456 => 0xb02b },
|
3266
3267
|
'fullpanoheightpixels' => { 507 => 'FullPanoHeightPixels', 508 => 'FullPanoHeightPixels' },
|
@@ -9862,6 +9863,7 @@ my %tagExists = (
|
|
9862
9863
|
'hasxfa' => 1,
|
9863
9864
|
'hcusage' => 1,
|
9864
9865
|
'hdcontent' => 1,
|
9866
|
+
'hdgainmapinfo' => 1,
|
9865
9867
|
'hdmibitdepth' => 1,
|
9866
9868
|
'hdmiexternalrecorder' => 1,
|
9867
9869
|
'hdmioutputhdr' => 1,
|
@@ -12813,6 +12815,7 @@ my %tagExists = (
|
|
12813
12815
|
'unknown02' => 1,
|
12814
12816
|
'unknown03' => 1,
|
12815
12817
|
'unknown_cndb' => 1,
|
12818
|
+
'unknown_grpl' => 1,
|
12816
12819
|
'unknown_h' => 1,
|
12817
12820
|
'unknown_m' => 1,
|
12818
12821
|
'unknown_slmt' => 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 28224 tags, with 17515 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
|
@@ -8643,6 +8643,7 @@ specification.
|
|
8643
8643
|
'cept' ColorEncodingParams no
|
8644
8644
|
'chad' ChromaticAdaptation no
|
8645
8645
|
'chrm' Chromaticity ICC_Profile Chromaticity
|
8646
|
+
'cicp' ColorRepresentation ICC_Profile ColorRep
|
8646
8647
|
'ciis' ColorimetricIntentImageState no
|
8647
8648
|
'clio' ColorantInfoOut no
|
8648
8649
|
'cloo' ColorantOrderOut no
|
@@ -8681,6 +8682,7 @@ specification.
|
|
8681
8682
|
'gdb1' GamutBoundaryDescription1 no
|
8682
8683
|
'gdb2' GamutBoundaryDescription2 no
|
8683
8684
|
'gdb3' GamutBoundaryDescription3 no
|
8685
|
+
'hdgm' HDGainMapInfo no
|
8684
8686
|
'kTRC' GrayTRC no
|
8685
8687
|
'lumi' Luminance no
|
8686
8688
|
'mcta' MultiplexTypeArray no
|
@@ -8762,6 +8764,15 @@ specification.
|
|
8762
8764
|
28 ChromaticityChannel3 no
|
8763
8765
|
36 ChromaticityChannel4 no
|
8764
8766
|
|
8767
|
+
=head3 ICC_Profile ColorRep Tags
|
8768
|
+
|
8769
|
+
Index1 Tag Name Writable
|
8770
|
+
------ -------- --------
|
8771
|
+
8 ColorPrimaries no
|
8772
|
+
9 TransferCharacteristics no
|
8773
|
+
10 MatrixCoefficients no
|
8774
|
+
11 VideoFullRangeFlag no
|
8775
|
+
|
8765
8776
|
=head3 ICC_Profile ColorantTable Tags
|
8766
8777
|
|
8767
8778
|
Index1 Tag Name Writable
|
@@ -8968,6 +8979,8 @@ access to this information.
|
|
8968
8979
|
|
8969
8980
|
=head3 Photoshop ChannelOptions Tags
|
8970
8981
|
|
8982
|
+
These tags relate only to the appearance of a channel.
|
8983
|
+
|
8971
8984
|
Index1 Tag Name Writable
|
8972
8985
|
------ -------- --------
|
8973
8986
|
0 ChannelColorSpace no
|
@@ -30273,6 +30286,8 @@ changed via the config file.
|
|
30273
30286
|
'director' Director yes
|
30274
30287
|
'displayname' DisplayName yes
|
30275
30288
|
'encoder' Encoder yes
|
30289
|
+
'full-frame-rate-playback-intent'
|
30290
|
+
FullFrameRatePlaybackIntent yes
|
30276
30291
|
'genre' Genre yes
|
30277
30292
|
'information' Information yes
|
30278
30293
|
'keywords' Keywords yes
|
@@ -30405,6 +30420,7 @@ Tags found in Pittasoft Blackvue dashcam "free" data.
|
|
30405
30420
|
'bxml' BinaryXML? no
|
30406
30421
|
'dinf' DataInfo QuickTime DataInfo
|
30407
30422
|
'free' Free? no
|
30423
|
+
'grpl' Unknown_grpl QuickTime grpl
|
30408
30424
|
'hdlr' Handler QuickTime Handler
|
30409
30425
|
'idat' MetaImageSize no
|
30410
30426
|
'iinf' ItemInformation QuickTime ItemInfo
|
@@ -30439,6 +30455,12 @@ MP4 data reference box.
|
|
30439
30455
|
'url ' URL no
|
30440
30456
|
'urn ' URN no
|
30441
30457
|
|
30458
|
+
=head3 QuickTime grpl Tags
|
30459
|
+
|
30460
|
+
Tag ID Tag Name Writable
|
30461
|
+
------ -------- --------
|
30462
|
+
[no tags known]
|
30463
|
+
|
30442
30464
|
=head3 QuickTime Handler Tags
|
30443
30465
|
|
30444
30466
|
Index1 Tag Name Writable
|
@@ -482,23 +482,26 @@ sub WriteKeys($$$)
|
|
482
482
|
sub WriteItemInfo($$$)
|
483
483
|
{
|
484
484
|
my ($et, $dirInfo, $outfile) = @_;
|
485
|
-
my $boxPos = $$dirInfo{BoxPos};
|
485
|
+
my $boxPos = $$dirInfo{BoxPos}; # hash of [position,length,irefVer(iref only)] for box in $outfile
|
486
486
|
my $raf = $$et{RAF};
|
487
487
|
my $items = $$et{ItemInfo};
|
488
|
-
my (%did, @mdatEdit, $name);
|
488
|
+
my (%did, @mdatEdit, $name, $tmap);
|
489
489
|
|
490
490
|
return () unless $items and $raf;
|
491
491
|
|
492
492
|
# extract information from EXIF/XMP metadata items
|
493
493
|
my $primary = $$et{PrimaryItem};
|
494
494
|
my $curPos = $raf->Tell();
|
495
|
+
my $lastID = 0;
|
495
496
|
my $id;
|
496
497
|
foreach $id (sort { $a <=> $b } keys %$items) {
|
498
|
+
$lastID = $id;
|
497
499
|
$primary = $id unless defined $primary; # assume primary is lowest-number item if pitm missing
|
498
500
|
my $item = $$items{$id};
|
499
501
|
# only edit primary EXIF/XMP metadata
|
500
502
|
next unless $$item{RefersTo} and $$item{RefersTo}{$primary};
|
501
503
|
my $type = $$item{ContentType} || $$item{Type} || next;
|
504
|
+
$tmap = $id if $type eq 'tmap'; # save ID of primary 'tmap' item (tone-mapped image)
|
502
505
|
# get ExifTool name for this item
|
503
506
|
$name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type};
|
504
507
|
next unless $name; # only care about EXIF and XMP
|
@@ -700,8 +703,10 @@ sub WriteItemInfo($$$)
|
|
700
703
|
$type = "Exif\0";
|
701
704
|
$mime = '';
|
702
705
|
}
|
703
|
-
my $id =
|
704
|
-
|
706
|
+
my $id = ++$lastID; # use next highest available ID (so ID's in iinf are in order)
|
707
|
+
#[retracted] # create new item information hash to save infe box in case we need it for sorting
|
708
|
+
#[retracted] my $item = $$items{$id} = { };
|
709
|
+
# add new infe entry to iinf box
|
705
710
|
my $n = length($type) + length($mime) + length($enc) + 16;
|
706
711
|
if ($id < 0x10000) {
|
707
712
|
$add{iinf} .= pack('Na4CCCCnn', $n, 'infe', 2, 0, 0, 1, $id, 0) . $type . $mime . $enc;
|
@@ -709,11 +714,14 @@ sub WriteItemInfo($$$)
|
|
709
714
|
$n += 2;
|
710
715
|
$add{iinf} .= pack('Na4CCCCNn', $n, 'infe', 3, 0, 0, 1, $id, 0) . $type . $mime . $enc;
|
711
716
|
}
|
712
|
-
# add
|
717
|
+
#[retracted] $add{iinf} .= $$item{infe};
|
718
|
+
# add new cdsc to iref (also refer to primary 'tmap' if it exists)
|
713
719
|
if ($irefVer) {
|
714
|
-
$
|
720
|
+
my ($fmt, $siz, $num) = defined $tmap ? ('N', 22, 2) : ('', 18, 1);
|
721
|
+
$add{iref} .= pack('Na4NnN'.$fmt, $siz, 'cdsc', $id, $num, $primary, $tmap);
|
715
722
|
} else {
|
716
|
-
$
|
723
|
+
my ($fmt, $siz, $num) = defined $tmap ? ('n', 16, 2) : ('', 14, 1);
|
724
|
+
$add{iref} .= pack('Na4nnn'.$fmt, $siz, 'cdsc', $id, $num, $primary, $tmap);
|
717
725
|
}
|
718
726
|
# add new entry to iloc table (see ISO14496-12:2015 pg.79)
|
719
727
|
my $ilocVer = Get8u($outfile, $$boxPos{iloc}[0] + 8);
|
@@ -778,8 +786,9 @@ sub WriteItemInfo($$$)
|
|
778
786
|
my $added = 0;
|
779
787
|
my $tag;
|
780
788
|
foreach $tag (sort { $$boxPos{$a}[0] <=> $$boxPos{$b}[0] } keys %$boxPos) {
|
789
|
+
$$boxPos{$tag}[0] += $added;
|
781
790
|
next unless $add{$tag};
|
782
|
-
my $pos = $$boxPos{$tag}[0]
|
791
|
+
my $pos = $$boxPos{$tag}[0];
|
783
792
|
unless ($$boxPos{$tag}[1]) {
|
784
793
|
$tag eq 'iref' or $et->Error('Internal error adding iref box'), last;
|
785
794
|
# create new iref box
|
@@ -826,9 +835,34 @@ sub WriteItemInfo($$$)
|
|
826
835
|
}
|
827
836
|
# add new entries to this box (or add pitm after hdlr)
|
828
837
|
substr($$outfile, $pos + $$boxPos{$tag}[1], 0) = $add{$tag};
|
838
|
+
$$boxPos{$tag}[1] += length $add{$tag};
|
829
839
|
$added += length $add{$tag}; # positions are shifted by length of new entries
|
830
840
|
}
|
831
841
|
}
|
842
|
+
#[This sorting idea was retracted because just sorting 'iinf' wasn't sufficient to
|
843
|
+
# repair the problem where an out-of-order ID was added -- Apple Preview still
|
844
|
+
# ignores the gain-map image. It looks like either or both 'iref' and 'iloc' must
|
845
|
+
# also be sorted by ID, although the spec doesn't mention this]
|
846
|
+
#[retracted] # sort infe entries in iinf box if necessary
|
847
|
+
#[retracted] if ($$et{ItemsNotSorted}) {
|
848
|
+
#[retracted] if ($$boxPos{iinf}) {
|
849
|
+
#[retracted] my $iinfVer = Get8u($outfile, $$boxPos{iinf}[0] + 8);
|
850
|
+
#[retracted] my $off = $iinfVer == 0 ? 14 : 16; # offset to first infe item
|
851
|
+
#[retracted] my $sorted = ''; # sorted iinf payload
|
852
|
+
#[retracted] $sorted .= $$items{$_}{infe} || '' foreach sort { $a <=> $b } keys %$items;
|
853
|
+
#[retracted] if (length $sorted == $$boxPos{iinf}[1]-$off) {
|
854
|
+
#[retracted] # replace with sorted infe entries
|
855
|
+
#[retracted] substr($$outfile, $$boxPos{iinf}[0] + $off, length $sorted) = $sorted;
|
856
|
+
#[retracted] $et->Warn('Item info entries are out of order. Fixed.');
|
857
|
+
#[retracted] ++$$et{CHANGED};
|
858
|
+
#[retracted] } else {
|
859
|
+
#[retracted] $et->Warn('Error sorting item info entries');
|
860
|
+
#[retracted] }
|
861
|
+
#[retracted] } else {
|
862
|
+
#[retracted] $et->Warn('Item info entries are out of order');
|
863
|
+
#[retracted] }
|
864
|
+
#[retracted] delete $$et{ItemsNotSorted};
|
865
|
+
#[retracted] }
|
832
866
|
delete $$et{ItemInfo};
|
833
867
|
return @mdatEdit ? \@mdatEdit : undef;
|
834
868
|
}
|
@@ -1129,7 +1163,7 @@ sub WriteQuickTime($$$)
|
|
1129
1163
|
next;
|
1130
1164
|
}
|
1131
1165
|
}
|
1132
|
-
undef $tagInfo if $tagInfo and $$tagInfo{
|
1166
|
+
undef $tagInfo if $tagInfo and $$tagInfo{AddedUnknown};
|
1133
1167
|
|
1134
1168
|
if ($tagInfo and (not defined $$tagInfo{Writable} or $$tagInfo{Writable})) {
|
1135
1169
|
my $subdir = $$tagInfo{SubDirectory};
|
@@ -4993,7 +4993,7 @@ my $strptimeLib; # strptime library name if available
|
|
4993
4993
|
sub InverseDateTime($$;$$)
|
4994
4994
|
{
|
4995
4995
|
my ($self, $val, $tzFlag, $dateOnly) = @_;
|
4996
|
-
my ($rtnVal, $tz);
|
4996
|
+
my ($rtnVal, $tz, $fs);
|
4997
4997
|
my $fmt = $$self{OPTIONS}{DateFormat};
|
4998
4998
|
# strip off timezone first if it exists
|
4999
4999
|
if (not $fmt and $val =~ s/([-+])(\d{1,2}):?(\d{2})\s*(DST)?$//i) {
|
@@ -5019,8 +5019,17 @@ sub InverseDateTime($$;$$)
|
|
5019
5019
|
$strptimeLib = '';
|
5020
5020
|
}
|
5021
5021
|
}
|
5022
|
-
# handle
|
5023
|
-
|
5022
|
+
# handle fractional seconds (%f) and time zone (%z)
|
5023
|
+
($fs, $tz) = ('', '');
|
5024
|
+
if ($fmt =~ /%(f|:?z)/) {
|
5025
|
+
if ($fmt =~ s/(.*[^%])%f/$1/) {
|
5026
|
+
$fs = $2 if $val =~ s/(.*)(\.\d+)/$1/; # (take last .### as fractional seconds)
|
5027
|
+
}
|
5028
|
+
if ($fmt =~ s/(.*[^%])%(:?)z/$1/) {
|
5029
|
+
my $colon = $2;
|
5030
|
+
$tz = "$2:$3" if $val =~ s/(.*)([-+]\d{2})$colon(\d{2})/$1/;
|
5031
|
+
}
|
5032
|
+
}
|
5024
5033
|
my ($lib, $wrn, @a);
|
5025
5034
|
TryLib: for ($lib=$strptimeLib; ; $lib='') {
|
5026
5035
|
# handle %s format ourself (not supported in Fedora, see forum15032)
|
@@ -5065,7 +5074,7 @@ TryLib: for ($lib=$strptimeLib; ; $lib='') {
|
|
5065
5074
|
$a[$i] = "0$a[$i]"; # pad to 2 digits if necessary
|
5066
5075
|
}
|
5067
5076
|
}
|
5068
|
-
$val = join(':', @a[5,4,3]) . ' ' . join(':', @a[2,1,0]) . $fs;
|
5077
|
+
$val = join(':', @a[5,4,3]) . ' ' . join(':', @a[2,1,0]) . $fs . $tz;
|
5069
5078
|
last;
|
5070
5079
|
}
|
5071
5080
|
}
|
@@ -5077,7 +5086,9 @@ TryLib: for ($lib=$strptimeLib; ; $lib='') {
|
|
5077
5086
|
my $ss = $a[4]; # get SS
|
5078
5087
|
push @a, '00' while @a < 5; # add MM, SS if not given
|
5079
5088
|
# get sub-seconds if they exist (must be after SS, and have leading ".")
|
5080
|
-
|
5089
|
+
unless ($fmt) {
|
5090
|
+
$fs = (@a > 5 and $val =~ /(\.\d+)\s*$/) ? $1 : '';
|
5091
|
+
}
|
5081
5092
|
# add/remove timezone if necessary
|
5082
5093
|
if ($tzFlag) {
|
5083
5094
|
if (not $tz) {
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -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 $advFmtSelf);
|
31
31
|
|
32
|
-
$VERSION = '13.
|
32
|
+
$VERSION = '13.10';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
@@ -6551,11 +6551,13 @@ sub ConvertDateTime($$)
|
|
6551
6551
|
$fmt =~ s/(^|[^%])((%%)*)%-?\.?\d*f/$1$2$frac/g;
|
6552
6552
|
}
|
6553
6553
|
# parse %z and %s ourself (to handle time zones properly)
|
6554
|
-
if ($fmt =~
|
6554
|
+
if ($fmt =~ /%:?[sz]/) {
|
6555
6555
|
# use system time zone unless otherwise specified
|
6556
6556
|
$tz = TimeZoneString(\@a, TimeLocal(@a)) if not $tz and eval { require Time::Local };
|
6557
6557
|
# remove colon, setting to UTC if time zone is not numeric
|
6558
|
-
$tz =
|
6558
|
+
$tz = '+00:00' unless $tz and $tz=~/^[-+]\d{2}:\d{2}$/;
|
6559
|
+
$fmt =~ s/(^|[^%])((%%)*)%:z/$1$2$tz/g; # convert '%:z' format codes
|
6560
|
+
$tz =~ s/://;
|
6559
6561
|
$fmt =~ s/(^|[^%])((%%)*)%z/$1$2$tz/g; # convert '%z' format codes
|
6560
6562
|
if ($fmt =~ /%s/ and eval { require Time::Local }) {
|
6561
6563
|
# calculate seconds since the Epoch, UTC
|
@@ -8961,8 +8963,9 @@ sub GetTagInfo($$$;$$$)
|
|
8961
8963
|
next;
|
8962
8964
|
}
|
8963
8965
|
}
|
8964
|
-
# don't return Unknown tags unless that option is set (also see forum13716)
|
8965
|
-
if ($$tagInfo{Unknown} and not $$options{Unknown} and
|
8966
|
+
# don't return Unknown tags unless that option is set or we are writing (also see forum13716)
|
8967
|
+
if ($$tagInfo{Unknown} and not $$options{Unknown} and
|
8968
|
+
(not $$self{IsWriting} or $$tagInfo{AddedUnknown}) and not
|
8966
8969
|
($$options{Verbose} or $$self{HTML_DUMP} or
|
8967
8970
|
($$options{Validate} and not $$tagInfo{AddedUnknown})))
|
8968
8971
|
{
|
data/bin/lib/Image/ExifTool.pod
CHANGED
@@ -613,8 +613,10 @@ different when copying tags with L</SetNewValuesFromFile>.
|
|
613
613
|
Format for printing date/time values. See C<strftime> in the L<POSIX>
|
614
614
|
package and L<https://exiftool.org/filename.html#codes> for details about
|
615
615
|
the format string. If the date can not be converted, the value is left
|
616
|
-
unchanged unless the StrictDate option is set.
|
617
|
-
|
616
|
+
unchanged unless the StrictDate option is set. ExifTool adds a few
|
617
|
+
additional format specifiers (C<%f>, C<%s> and C<%z>), see
|
618
|
+
L<https://exiftool.org/filename.html#codes> for more details. The inverse
|
619
|
+
conversion (ie. when calling L</SetNewValue>) is performed only if
|
618
620
|
POSIX::strptime or Time::Piece is installed. The default setting of undef
|
619
621
|
causes date/time values to remain in standard EXIF format (similar to a
|
620
622
|
DateFormat of "%Y:%m:%d %H:%M:%S").
|
@@ -2559,39 +2561,39 @@ Ducky, EPPIM, EXE, EXIF, ExifIFD, ExifTool, FITS, FLAC, FLIR, File, Flash,
|
|
2559
2561
|
FlashPix, Font, FotoStation, FujiFilm, FujiIFD, GE, GIF, GIMP, GM, GPS,
|
2560
2562
|
GSpherical, Garmin, GeoTiff, GlobParamIFD, GoPro, GraphConv, H264, HP, HTC,
|
2561
2563
|
HTML, HTML-dc, HTML-ncc, HTML-office, HTML-prod, HTML-vw96, HTTP-equiv,
|
2562
|
-
ICC-chrm, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view,
|
2563
|
-
ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4,
|
2564
|
-
IPTC, IPTC#, ISO, ITC, InfiRay, Insta360, InteropIFD, ItemList,
|
2565
|
-
JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys,
|
2566
|
-
KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LIGO, LNK,
|
2567
|
-
LeafSubIFD, Leica, Lyrics3, Lytro, M-RAW, M2TS, MAC, MIE-Audio,
|
2568
|
-
MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo,
|
2569
|
-
MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient,
|
2570
|
-
MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB,
|
2571
|
-
MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, MakerNotes,
|
2572
|
-
Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, Minolta,
|
2573
|
-
Motorola, NITF, Nextbase, Nikon, NikonCapture, NikonCustom,
|
2574
|
-
NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR,
|
2575
|
-
PICT, PNG, PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic,
|
2576
|
-
Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop,
|
2577
|
-
PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm,
|
2578
|
-
RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real,
|
2579
|
-
Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD,
|
2580
|
-
SEAL, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG,
|
2581
|
-
Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD,
|
2582
|
-
Track#, UserData, VCalendar, VCard, VNote,
|
2583
|
-
|
2584
|
-
XMP-
|
2585
|
-
XMP-
|
2586
|
-
XMP-
|
2587
|
-
XMP-
|
2588
|
-
XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif,
|
2589
|
-
XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr,
|
2590
|
-
XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
|
2591
|
-
XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama,
|
2592
|
-
XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi,
|
2593
|
-
XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff,
|
2594
|
-
XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
|
2564
|
+
ICC-chrm, ICC-cicp, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view,
|
2565
|
+
ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4,
|
2566
|
+
IFD0, IFD1, IPTC, IPTC#, ISO, ITC, InfiRay, Insta360, InteropIFD, ItemList,
|
2567
|
+
JFIF, JFXX, JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys,
|
2568
|
+
Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LIGO, LNK,
|
2569
|
+
Leaf, LeafSubIFD, Leica, Lyrics3, Lytro, M-RAW, M2TS, MAC, MIE-Audio,
|
2570
|
+
MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo,
|
2571
|
+
MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient,
|
2572
|
+
MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB,
|
2573
|
+
MNG, MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, MakerNotes,
|
2574
|
+
MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, Minolta,
|
2575
|
+
MinoltaRaw, Motorola, NITF, Nextbase, Nikon, NikonCapture, NikonCustom,
|
2576
|
+
NikonScan, NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR,
|
2577
|
+
Opus, PDF, PICT, PNG, PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic,
|
2578
|
+
PanasonicRaw, Parrot, Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop,
|
2579
|
+
PictureInfo, PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm,
|
2580
|
+
QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real,
|
2581
|
+
Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD,
|
2582
|
+
Reconyx, Red, Ricoh, SEAL, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG,
|
2583
|
+
Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD,
|
2584
|
+
System, Theora, Torrent, Track#, UserData, VCalendar, VCard, VNote,
|
2585
|
+
Version0, Vorbis, WTV, XML, XMP, XMP-DICOM, XMP-Device, XMP-GAudio,
|
2586
|
+
XMP-GCamera, XMP-GContainer, XMP-GCreations, XMP-GDepth, XMP-GFocus,
|
2587
|
+
XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1,
|
2588
|
+
XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-acdsee-rs, XMP-album, XMP-apple-fi,
|
2589
|
+
XMP-ast, XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs,
|
2590
|
+
XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif,
|
2591
|
+
XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr,
|
2592
|
+
XMP-hdrgm, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
|
2593
|
+
XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama,
|
2594
|
+
XMP-pdf, XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi,
|
2595
|
+
XMP-prism, XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff,
|
2596
|
+
XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
|
2595
2597
|
XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes
|
2596
2598
|
|
2597
2599
|
=item Family 2 (Category):
|
@@ -2832,6 +2834,10 @@ for the system. In Windows this also has the effect of activating Unicode
|
|
2832
2834
|
filename support via the special Windows wide-character i/o routines if
|
2833
2835
|
Win32API::File is available.
|
2834
2836
|
|
2837
|
+
Note that setting the L</WindowsWideFile> or L</WindowsLongPath> option
|
2838
|
+
causes L</CharsetFileName> to default to 'UTF8' in Windows if not defined,
|
2839
|
+
and L</WindowsLongPath> is set by default in ExifTool 13.07 and later.
|
2840
|
+
|
2835
2841
|
=item Internal Character Sets:
|
2836
2842
|
|
2837
2843
|
The encodings used to store strings in the various metadata formats. These
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 13.
|
4
|
+
version: 13.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-12-
|
12
|
+
date: 2024-12-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|