exiftool-vendored.exe 12.70.0 → 12.72.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 +36 -1
- package/bin/exiftool_files/README +10 -10
- package/bin/exiftool_files/exiftool.pl +19 -14
- package/bin/exiftool_files/lib/Image/ExifTool/AAC.pm +175 -0
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +21 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +30 -9
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +5 -2
- package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +7 -4
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +4 -1
- package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +21 -16
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +158 -90
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +15 -6
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +29 -10
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +59 -11
- package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +109 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +3 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +83 -4
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4862 -4828
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +147 -42
- package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +19 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +81 -14
- package/bin/exiftool_files/lib/Image/ExifTool.pm +18 -6
- package/bin/exiftool_files/lib/Image/ExifTool.pod +19 -14
- package/package.json +5 -4
|
@@ -7,7 +7,42 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 12.70. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Dec. 29, 2023 - Version 12.72
|
|
11
|
+
|
|
12
|
+
- Added read support for AAC audio files
|
|
13
|
+
- Added a new QuickTime Keys Android tag
|
|
14
|
+
- Added a number of new values for some Ricoh GR III tags
|
|
15
|
+
- Decode timed metadata from Intsa360 Ace Pro MP4 videos
|
|
16
|
+
- Decode GPSDateTime milliseconds in timed Insta360 metadata
|
|
17
|
+
- Decode timed metadata from INNOV K5 TS videos
|
|
18
|
+
- Decode a number of new GoPro timed-metadata tags
|
|
19
|
+
- Decode a few new Xiaomi EXIF tags
|
|
20
|
+
- Fixed writing of JPG/ARW images from some newer Sony models to preserve
|
|
21
|
+
HiddenData
|
|
22
|
+
|
|
23
|
+
Dec. 21, 2023 - Version 12.71
|
|
24
|
+
|
|
25
|
+
- Added a warning if there was an error reading an alternate file with the
|
|
26
|
+
-fileNUM option
|
|
27
|
+
- Added the ability to write QuickTime Keys:Encoder
|
|
28
|
+
- Added a few new Canon LensType values (thanks Norbert Wasser)
|
|
29
|
+
- Added a new, obscure EXIF tag (thanks Neal Krawetz)
|
|
30
|
+
- Decode real-time metadata from Ricoh Theta videos
|
|
31
|
+
- Decode SpecularWhiteLevel for more Canon models (github #232)
|
|
32
|
+
- Decode Canon DualPixelRaw tag (thanks John Moyer)
|
|
33
|
+
- Decode a few new Nikon tags (thanks Warren Hatch)
|
|
34
|
+
- Decode more FujiFilm M-RAW tags (thanks Greybeard)
|
|
35
|
+
- Improved generation of tag names for some JSON tag ID's containing colons
|
|
36
|
+
- Fixed "Undefined subroutine" error when writing makernotes as a block
|
|
37
|
+
- Fixed missing ID in family 7 group name for ID3 tags which are not valid for
|
|
38
|
+
the specified ID3 version
|
|
39
|
+
- Fixed bug where some tags from alternate files (with the -fileNUM option)
|
|
40
|
+
could show up as "not defined" when used in expressions even though they did
|
|
41
|
+
exist
|
|
42
|
+
- API Changes:
|
|
43
|
+
- Added NoMandatory option
|
|
44
|
+
|
|
45
|
+
Nov. 19, 2023 - Version 12.70 (production release) - "20th Anniversary"
|
|
11
46
|
|
|
12
47
|
- This marks the 20th anniversary of the initial ExifTool release!
|
|
13
48
|
- Added ability to read/delete C2PA CAI JUMBF metadata from TIFF-based images
|
|
@@ -14,13 +14,14 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
14
14
|
|
|
15
15
|
File Types
|
|
16
16
|
------------+-------------+-------------+-------------+------------
|
|
17
|
-
360 r/w |
|
|
18
|
-
3FR r |
|
|
19
|
-
3G2 r/w |
|
|
20
|
-
3GP r/w |
|
|
21
|
-
7Z r |
|
|
22
|
-
A r |
|
|
23
|
-
AA r |
|
|
17
|
+
360 r/w | DOCX r | ISO r | NRW r/w | RAR r
|
|
18
|
+
3FR r | DPX r | ITC r | NUMBERS r | RAW r/w
|
|
19
|
+
3G2 r/w | DR4 r/w/c | J2C r | O r | RIFF r
|
|
20
|
+
3GP r/w | DSS r | JNG r/w | ODP r | RSRC r
|
|
21
|
+
7Z r | DV r | JP2 r/w | ODS r | RTF r
|
|
22
|
+
A r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
|
|
23
|
+
AA r | DVR-MS r | JSON r | OFR r | RWL r/w
|
|
24
|
+
AAC r | DYLIB r | JXL r | OGG r | RWZ r
|
|
24
25
|
AAE r | EIP r | K25 r | OGV r | RM r
|
|
25
26
|
AAX r/w | EPS r/w | KDC r | ONP r | SEQ r
|
|
26
27
|
ACR r | EPUB r | KEY r | OPUS r | SKETCH r
|
|
@@ -56,7 +57,6 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
56
57
|
DLL r | INSP r/w | MXF r | RA r | XLSX r
|
|
57
58
|
DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
|
|
58
59
|
DOC r | INX r | NKSC r/w | RAM r | ZIP r
|
|
59
|
-
DOCX r | ISO r | NRW r/w | RAR r |
|
|
60
60
|
|
|
61
61
|
Meta Information
|
|
62
62
|
----------------------+----------------------+---------------------
|
|
@@ -108,8 +108,8 @@ your home directory, then you would type the following commands in a
|
|
|
108
108
|
terminal window to extract and run ExifTool:
|
|
109
109
|
|
|
110
110
|
cd ~/Desktop
|
|
111
|
-
gzip -dc Image-ExifTool-12.
|
|
112
|
-
cd Image-ExifTool-12.
|
|
111
|
+
gzip -dc Image-ExifTool-12.72.tar.gz | tar -xf -
|
|
112
|
+
cd Image-ExifTool-12.72
|
|
113
113
|
./exiftool t/images/ExifTool.jpg
|
|
114
114
|
|
|
115
115
|
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.72';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -4636,13 +4636,14 @@ DESCRIPTION
|
|
|
4636
4636
|
|
|
4637
4637
|
File Types
|
|
4638
4638
|
------------+-------------+-------------+-------------+------------
|
|
4639
|
-
360 r/w |
|
|
4640
|
-
3FR r |
|
|
4641
|
-
3G2 r/w |
|
|
4642
|
-
3GP r/w |
|
|
4643
|
-
7Z r |
|
|
4644
|
-
A r |
|
|
4645
|
-
AA r |
|
|
4639
|
+
360 r/w | DOCX r | ISO r | NRW r/w | RAR r
|
|
4640
|
+
3FR r | DPX r | ITC r | NUMBERS r | RAW r/w
|
|
4641
|
+
3G2 r/w | DR4 r/w/c | J2C r | O r | RIFF r
|
|
4642
|
+
3GP r/w | DSS r | JNG r/w | ODP r | RSRC r
|
|
4643
|
+
7Z r | DV r | JP2 r/w | ODS r | RTF r
|
|
4644
|
+
A r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
|
|
4645
|
+
AA r | DVR-MS r | JSON r | OFR r | RWL r/w
|
|
4646
|
+
AAC r | DYLIB r | JXL r | OGG r | RWZ r
|
|
4646
4647
|
AAE r | EIP r | K25 r | OGV r | RM r
|
|
4647
4648
|
AAX r/w | EPS r/w | KDC r | ONP r | SEQ r
|
|
4648
4649
|
ACR r | EPUB r | KEY r | OPUS r | SKETCH r
|
|
@@ -4678,7 +4679,6 @@ DESCRIPTION
|
|
|
4678
4679
|
DLL r | INSP r/w | MXF r | RA r | XLSX r
|
|
4679
4680
|
DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
|
|
4680
4681
|
DOC r | INX r | NKSC r/w | RAM r | ZIP r
|
|
4681
|
-
DOCX r | ISO r | NRW r/w | RAR r |
|
|
4682
4682
|
|
|
4683
4683
|
Meta Information
|
|
4684
4684
|
----------------------+----------------------+---------------------
|
|
@@ -5458,7 +5458,7 @@ OPTIONS
|
|
|
5458
5458
|
file must have the same format as the exported JSON files with the
|
|
5459
5459
|
exception that options exporting JSON objects instead of simple
|
|
5460
5460
|
values are not compatible with the import file format (ie. export
|
|
5461
|
-
with -D, -H, -l, or -T is not
|
|
5461
|
+
with -D, -H, -l, or -T is not compatible, and use -G instead of
|
|
5462
5462
|
-g). Additionally, tag names in the input JSON file may be suffixed
|
|
5463
5463
|
with a "#" to disable print conversion.
|
|
5464
5464
|
|
|
@@ -5604,7 +5604,7 @@ OPTIONS
|
|
|
5604
5604
|
|
|
5605
5605
|
produces output like this:
|
|
5606
5606
|
|
|
5607
|
-
-- Generated by ExifTool 12.
|
|
5607
|
+
-- Generated by ExifTool 12.72 --
|
|
5608
5608
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5609
5609
|
(f/5.6, 1/60s, ISO 100)
|
|
5610
5610
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6606,10 +6606,15 @@ OPTIONS
|
|
|
6606
6606
|
OriginalFileName tag has been set in the edited file, a command to
|
|
6607
6607
|
copy Rights from the original file could look like this:
|
|
6608
6608
|
|
|
6609
|
-
exiftool -file1
|
|
6609
|
+
exiftool -file1 '$originalfilename' '-rights<file1:rights' edited.jpg
|
|
6610
6610
|
|
|
6611
|
-
|
|
6612
|
-
|
|
6611
|
+
Subtle note: If a -tagsFromFile option is used, tags in the
|
|
6612
|
+
*ALTFILE* argument come from the *SRCFILE* that applies to the
|
|
6613
|
+
first argument accessing tags from the corresponding "FileNUM"
|
|
6614
|
+
group.
|
|
6615
|
+
|
|
6616
|
+
User-defined Composite tags may access tags from alternate files
|
|
6617
|
+
using the appropriate (case-sensitive) family 8 group name.
|
|
6613
6618
|
|
|
6614
6619
|
-list_dir
|
|
6615
6620
|
List directories themselves instead of their contents. This option
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#------------------------------------------------------------------------------
|
|
2
|
+
# File: AAC.pm
|
|
3
|
+
#
|
|
4
|
+
# Description: Read AAC audio files
|
|
5
|
+
#
|
|
6
|
+
# Revisions: 2023-12-29 - P. Harvey Created
|
|
7
|
+
#------------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
package Image::ExifTool::AAC;
|
|
10
|
+
|
|
11
|
+
use strict;
|
|
12
|
+
use vars qw($VERSION);
|
|
13
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
|
+
use Image::ExifTool::FLAC;
|
|
15
|
+
|
|
16
|
+
$VERSION = '1.00';
|
|
17
|
+
|
|
18
|
+
my %convSampleRate = (
|
|
19
|
+
0 => 96000, 7 => 22050,
|
|
20
|
+
1 => 88200, 8 => 16000,
|
|
21
|
+
2 => 64000, 9 => 12000,
|
|
22
|
+
3 => 48000, 10 => 11025,
|
|
23
|
+
4 => 44100, 11 => 8000,
|
|
24
|
+
5 => 32000, 12 => 7350,
|
|
25
|
+
6 => 24000,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
%Image::ExifTool::AAC::Main = (
|
|
29
|
+
PROCESS_PROC => \&Image::ExifTool::FLAC::ProcessBitStream,
|
|
30
|
+
GROUPS => { 2 => 'Audio' },
|
|
31
|
+
# Bit000-011 - sync word (all 1's)
|
|
32
|
+
# Bit012 - ID (seems to be always 0)
|
|
33
|
+
# Bit013-014 - layer (00)
|
|
34
|
+
# Bit015 - CRC absent (0=crc exists, 1=no crc)
|
|
35
|
+
'Bit016-017' => {
|
|
36
|
+
Name => 'ProfileType',
|
|
37
|
+
PrintConv => {
|
|
38
|
+
0 => 'Main',
|
|
39
|
+
1 => 'Low Complexity',
|
|
40
|
+
2 => 'Scalable Sampling Rate',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
'Bit018-021' => {
|
|
44
|
+
Name => 'SampleRate',
|
|
45
|
+
ValueConv => \%convSampleRate,
|
|
46
|
+
},
|
|
47
|
+
# Bit022 - private
|
|
48
|
+
'Bit023-025' => {
|
|
49
|
+
Name => 'Channels',
|
|
50
|
+
PrintConv => {
|
|
51
|
+
0 => '?',
|
|
52
|
+
1 => 1,
|
|
53
|
+
2 => 2,
|
|
54
|
+
3 => 3,
|
|
55
|
+
4 => 4,
|
|
56
|
+
5 => 5,
|
|
57
|
+
6 => '5+1',
|
|
58
|
+
7 => '7+1',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
# Bit026 - original/copy
|
|
62
|
+
# Bit027 - home
|
|
63
|
+
# Bit028 - copyright ID
|
|
64
|
+
# Bit029 - copyright start
|
|
65
|
+
# Bit030-042 - FrameLength
|
|
66
|
+
# Bit043-053 - buffer fullness
|
|
67
|
+
# Bit054-055 - BlocksInFrame (minus 1)
|
|
68
|
+
# Note: Bitrate for frame = FrameLength * 8 * SampleRate / ((BlocksInFrame+1) * 1024)
|
|
69
|
+
# - but all frames must be scanned to calculate average bitrate
|
|
70
|
+
Encoder => {
|
|
71
|
+
Name => 'Encoder',
|
|
72
|
+
Notes => 'taken from filler payload of first frame',
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
#------------------------------------------------------------------------------
|
|
77
|
+
# Read information from an AAC file
|
|
78
|
+
# Inputs: 0) ExifTool object reference, 1) Directory information reference
|
|
79
|
+
# Returns: 1 on success, 0 if this wasn't a valid AAC file
|
|
80
|
+
sub ProcessAAC($$)
|
|
81
|
+
{
|
|
82
|
+
my ($et, $dirInfo) = @_;
|
|
83
|
+
my $raf = $$dirInfo{RAF};
|
|
84
|
+
my ($buff, $buf2);
|
|
85
|
+
|
|
86
|
+
# format of frame header (7 bytes):
|
|
87
|
+
# SSSS SSSS SSSS ILLC PPRR RRpC CCoh csff ffff ffff fffb bbbb bbbb bbNN
|
|
88
|
+
# 1111 1111 1111 0001 0110 0000 0100 0000 0000 0101 0101 1111 1111 1100 (eg.)
|
|
89
|
+
# S = sync word o = original/copy
|
|
90
|
+
# I = ID h = home
|
|
91
|
+
# L = layer (00) c = copyright ID
|
|
92
|
+
# C = CRC absent s = copyright start
|
|
93
|
+
# P = profile object type f = frame length
|
|
94
|
+
# R = sampling rate index b = buffer fullness
|
|
95
|
+
# p = private N = number of raw data blocks in frame
|
|
96
|
+
# C = channel configuration
|
|
97
|
+
|
|
98
|
+
$raf->Read($buff, 7) == 7 or return 0;
|
|
99
|
+
return 0 unless $buff =~ /^\xff[\xf0\xf1]/;
|
|
100
|
+
my @t = unpack('NnC', $buff);
|
|
101
|
+
return 0 if (($t[0] >> 16) & 0x03) == 3; # (reserved profile type)
|
|
102
|
+
return 0 if (($t[0] >> 12) & 0x0f) > 12; # validate sampling frequency index
|
|
103
|
+
my $len = (($t[0] << 11) & 0x1800) | (($t[1] >> 5) & 0x07ff);
|
|
104
|
+
return 0 if $len < 7;
|
|
105
|
+
|
|
106
|
+
$et->SetFileType();
|
|
107
|
+
|
|
108
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::AAC::Main');
|
|
109
|
+
$et->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr);
|
|
110
|
+
|
|
111
|
+
# read the first frame data to check for a filler with the encoder name
|
|
112
|
+
if ($len > 8 and $raf->Read($buff, $len-7) == $len-7) {
|
|
113
|
+
my $noCRC = ($t[0] & 0x00010000);
|
|
114
|
+
my $blocks = ($t[2] & 0x03);
|
|
115
|
+
my $pos = 0;
|
|
116
|
+
$pos += 2 + 2 * $blocks unless $noCRC;
|
|
117
|
+
last if $pos + 2 > length($buff);
|
|
118
|
+
my $tmp = unpack("x${pos}n", $buff);
|
|
119
|
+
my $id = $tmp >> 13;
|
|
120
|
+
# read filler payload
|
|
121
|
+
if ($id == 6) {
|
|
122
|
+
my $cnt = ($tmp >> 9) & 0x0f;
|
|
123
|
+
++$pos;
|
|
124
|
+
if ($cnt == 15) {
|
|
125
|
+
$cnt += (($tmp >> 1) & 0xff) - 1 if $cnt == 15;
|
|
126
|
+
++$pos;
|
|
127
|
+
}
|
|
128
|
+
if ($pos + $cnt < length($buff)) {
|
|
129
|
+
my $dat = substr($buff, $pos, $cnt);
|
|
130
|
+
$dat =~ s/^\0+//;
|
|
131
|
+
$dat =~ s/\0+$//;
|
|
132
|
+
$et->HandleTag($tagTablePtr, Encoder => $dat) if $dat =~ /^[\x20-\x7e]+$/;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return 1;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
1; # end
|
|
141
|
+
|
|
142
|
+
__END__
|
|
143
|
+
|
|
144
|
+
=head1 NAME
|
|
145
|
+
|
|
146
|
+
Image::ExifTool::AAC - Read AAC audio files
|
|
147
|
+
|
|
148
|
+
=head1 SYNOPSIS
|
|
149
|
+
|
|
150
|
+
This module is used by Image::ExifTool
|
|
151
|
+
|
|
152
|
+
=head1 DESCRIPTION
|
|
153
|
+
|
|
154
|
+
This module contains definitions required by Image::ExifTool to read AAC
|
|
155
|
+
audio files.
|
|
156
|
+
|
|
157
|
+
=head1 NOTES
|
|
158
|
+
|
|
159
|
+
Since ISO charges money for the official AAC specification, this module is
|
|
160
|
+
based on unofficial sources which may be incomplete, inaccurate or outdated.
|
|
161
|
+
|
|
162
|
+
=head1 AUTHOR
|
|
163
|
+
|
|
164
|
+
Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
|
|
165
|
+
|
|
166
|
+
This library is free software; you can redistribute it and/or modify it
|
|
167
|
+
under the same terms as Perl itself.
|
|
168
|
+
|
|
169
|
+
=head1 SEE ALSO
|
|
170
|
+
|
|
171
|
+
L<Image::ExifTool::TagNames/AAC Tags>,
|
|
172
|
+
L<Image::ExifTool(3pm)|Image::ExifTool>
|
|
173
|
+
|
|
174
|
+
=cut
|
|
175
|
+
|
|
@@ -219,7 +219,8 @@ writable directly, but is written automatically by ExifTool (often when a
|
|
|
219
219
|
corresponding L<Composite|Image::ExifTool::TagNames/Composite Tags> or
|
|
220
220
|
L<Extra|Image::ExifTool::TagNames/Extra Tags> tag is written). A colon
|
|
221
221
|
(C<:>) indicates a I<Mandatory> tag which may be added automatically when
|
|
222
|
-
writing
|
|
222
|
+
writing (use the API L<NoMandatory|../ExifTool.html#NoMandatory> option to avoid creating mandatory EXIF
|
|
223
|
+
tags). Normally MakerNotes tags may not be deleted individually, but a
|
|
223
224
|
caret (C<^>) indicates a I<Deletable> MakerNotes tag.
|
|
224
225
|
|
|
225
226
|
The HTML version of these tables also lists possible B<Values> for
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.72';
|
|
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)
|
|
@@ -627,7 +627,8 @@ $VERSION = '4.71';
|
|
|
627
627
|
'61182.51' => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
|
|
628
628
|
'61182.52' => 'Canon RF 10-20mm F4 L IS STM', #42
|
|
629
629
|
'61182.53' => 'Canon RF 28mm F2.8 STM', #42
|
|
630
|
-
|
|
630
|
+
'61182.54' => 'Canon RF 24-105mm F2.8 L IS USM Z', #42
|
|
631
|
+
'61182.55' => 'Canon RF-S 10-18mm F4.5-6.3 IS STM', #42
|
|
631
632
|
65535 => 'n/a',
|
|
632
633
|
);
|
|
633
634
|
|
|
@@ -4726,7 +4727,7 @@ my %ciMaxFocal = (
|
|
|
4726
4727
|
FIRST_ENTRY => 0,
|
|
4727
4728
|
PRIORITY => 0,
|
|
4728
4729
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
4729
|
-
NOTES => 'CameraInfo tags for the
|
|
4730
|
+
NOTES => 'CameraInfo tags for the PowerShot G5 X Mark II.',
|
|
4730
4731
|
0x0293 => {
|
|
4731
4732
|
Name => 'ShutterCount',
|
|
4732
4733
|
Format => 'int32u',
|
|
@@ -6950,8 +6951,13 @@ my %ciMaxFocal = (
|
|
|
6950
6951
|
306 => 'Canon RF 100-300mm F2.8L IS USM', #42
|
|
6951
6952
|
307 => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
|
|
6952
6953
|
308 => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
|
|
6954
|
+
309 => 'Canon RF 200-800mm F6.3-9 IS USM', #42
|
|
6955
|
+
310 => 'Canon RF 200-800mm F6.3-9 IS USM + RF1.4x', #42
|
|
6956
|
+
311 => 'Canon RF 200-800mm F6.3-9 IS USM + RF2x', #42
|
|
6953
6957
|
312 => 'Canon RF 10-20mm F4 L IS STM', #42
|
|
6954
6958
|
313 => 'Canon RF 28mm F2.8 STM', #42
|
|
6959
|
+
314 => 'Canon RF 24-105mm F2.8 L IS USM Z', #42
|
|
6960
|
+
315 => 'Canon RF-S 10-18mm F4.5-6.3 IS STM', #42
|
|
6955
6961
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6956
6962
|
},
|
|
6957
6963
|
},
|
|
@@ -7468,7 +7474,7 @@ my %ciMaxFocal = (
|
|
|
7468
7474
|
RawConv => '$$self{ColorDataVersion} = $val',
|
|
7469
7475
|
PrintConv => {
|
|
7470
7476
|
2 => '2 (1DmkIII)',
|
|
7471
|
-
3 => '3 (40D)',
|
|
7477
|
+
3 => '3 (40D)', # (doesn't record SpecularWhiteLevel, ref github#233)
|
|
7472
7478
|
4 => '4 (1DSmkIII)',
|
|
7473
7479
|
5 => '5 (450D/1000D)',
|
|
7474
7480
|
6 => '6 (50D/5DmkII)',
|
|
@@ -7778,10 +7784,15 @@ my %ciMaxFocal = (
|
|
|
7778
7784
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib2' }
|
|
7779
7785
|
},
|
|
7780
7786
|
0x108=> { #IB
|
|
7781
|
-
Name => 'PerChannelBlackLevel',
|
|
7787
|
+
Name => 'PerChannelBlackLevel', # (or perhaps AverageBlackLevel?, ref github#232)
|
|
7782
7788
|
Condition => '$$self{ColorDataVersion} == -3',
|
|
7783
7789
|
Format => 'int16s[4]',
|
|
7784
7790
|
},
|
|
7791
|
+
0x296 => { #github#232
|
|
7792
|
+
Name => 'SpecularWhiteLevel',
|
|
7793
|
+
Condition => '$$self{ColorDataVersion} == -3',
|
|
7794
|
+
Format => 'int16u',
|
|
7795
|
+
},
|
|
7785
7796
|
0x14d=> { #IB
|
|
7786
7797
|
Name => 'PerChannelBlackLevel',
|
|
7787
7798
|
Condition => '$$self{ColorDataVersion} == -4',
|
|
@@ -8696,7 +8707,7 @@ my %ciMaxFocal = (
|
|
|
8696
8707
|
},
|
|
8697
8708
|
);
|
|
8698
8709
|
|
|
8699
|
-
# Auto Lighting
|
|
8710
|
+
# Auto Lighting Optimizer information (MakerNotes tag 0x4018) (ref PH)
|
|
8700
8711
|
%Image::ExifTool::Canon::LightingOpt = (
|
|
8701
8712
|
%binaryDataAttrs,
|
|
8702
8713
|
FORMAT => 'int32s',
|
|
@@ -8748,6 +8759,10 @@ my %ciMaxFocal = (
|
|
|
8748
8759
|
2 => 'High',
|
|
8749
8760
|
},
|
|
8750
8761
|
},
|
|
8762
|
+
11 => { #forum15445
|
|
8763
|
+
Name => 'DualPixelRaw',
|
|
8764
|
+
PrintConv => \%offOn,
|
|
8765
|
+
},
|
|
8751
8766
|
);
|
|
8752
8767
|
|
|
8753
8768
|
# Lens information (MakerNotes tag 0x4019) (ref 20)
|
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
58
58
|
use Image::ExifTool::MakerNotes;
|
|
59
59
|
|
|
60
|
-
$VERSION = '4.
|
|
60
|
+
$VERSION = '4.48';
|
|
61
61
|
|
|
62
62
|
sub ProcessExif($$$);
|
|
63
63
|
sub WriteExif($$$);
|
|
@@ -1426,12 +1426,12 @@ my %opcodeInfo = (
|
|
|
1426
1426
|
Count => 6,
|
|
1427
1427
|
Priority => 0,
|
|
1428
1428
|
},
|
|
1429
|
-
# 0x220 - int32u: 0 (IFD0,
|
|
1430
|
-
# 0x221 - int32u: 0 (IFD0,
|
|
1431
|
-
# 0x222 - int32u: 0 (IFD0,
|
|
1432
|
-
# 0x223 - int32u: 0 (IFD0,
|
|
1433
|
-
# 0x224 - int32u: 0,1 (IFD0,
|
|
1434
|
-
# 0x225 - string: "" (IFD0,
|
|
1429
|
+
# 0x220 - int32u: 0 (IFD0, Xiaomi Redmi models)
|
|
1430
|
+
# 0x221 - int32u: 0 (IFD0, Xiaomi Redmi models)
|
|
1431
|
+
# 0x222 - int32u: 0 (IFD0, Xiaomi Redmi models)
|
|
1432
|
+
# 0x223 - int32u: 0 (IFD0, Xiaomi Redmi models)
|
|
1433
|
+
# 0x224 - int32u: 0,1 (IFD0, Xiaomi Redmi models)
|
|
1434
|
+
# 0x225 - string: "" (IFD0, Xiaomi Redmi models)
|
|
1435
1435
|
0x22f => 'StripRowCounts',
|
|
1436
1436
|
0x2bc => {
|
|
1437
1437
|
Name => 'ApplicationNotes', # (writable directory!)
|
|
@@ -1445,6 +1445,16 @@ my %opcodeInfo = (
|
|
|
1445
1445
|
TagTable => 'Image::ExifTool::XMP::Main',
|
|
1446
1446
|
},
|
|
1447
1447
|
},
|
|
1448
|
+
0x303 => { #https://learn.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-constant-property-item-descriptions
|
|
1449
|
+
Name => 'RenderingIntent',
|
|
1450
|
+
Format => 'int8u',
|
|
1451
|
+
PrintConv => {
|
|
1452
|
+
0 => 'Perceptual',
|
|
1453
|
+
1 => 'Relative Colorimetric',
|
|
1454
|
+
2 => 'Saturation',
|
|
1455
|
+
3 => 'Absolute colorimetric',
|
|
1456
|
+
},
|
|
1457
|
+
},
|
|
1448
1458
|
0x3e7 => 'USPTOMiscellaneous', #20
|
|
1449
1459
|
0x1000 => { #5
|
|
1450
1460
|
Name => 'RelatedImageFileFormat',
|
|
@@ -2523,8 +2533,18 @@ my %opcodeInfo = (
|
|
|
2523
2533
|
Name => 'CameraElevationAngle',
|
|
2524
2534
|
Writable => 'rational64s',
|
|
2525
2535
|
},
|
|
2526
|
-
|
|
2527
|
-
|
|
2536
|
+
0x9999 => { # (ExifIFD, Xiaomi)
|
|
2537
|
+
Name => 'XiaomiSettings', # (writable directory!)
|
|
2538
|
+
Writable => 'string',
|
|
2539
|
+
Protected => 1,
|
|
2540
|
+
SubDirectory => { TagTable => 'Image::ExifTool::JSON::Main' },
|
|
2541
|
+
},
|
|
2542
|
+
0x9a00 => {
|
|
2543
|
+
Name => 'XiaomiModel',
|
|
2544
|
+
Writable => 'string',
|
|
2545
|
+
Protected => 1,
|
|
2546
|
+
},
|
|
2547
|
+
# 0x9aaa - int8u[2048/2176]: ? (ExifIFD, Xiaomi POCO F1)
|
|
2528
2548
|
0x9c9b => {
|
|
2529
2549
|
Name => 'XPTitle',
|
|
2530
2550
|
Format => 'undef',
|
|
@@ -2976,6 +2996,7 @@ my %opcodeInfo = (
|
|
|
2976
2996
|
0xa480 => { Name => 'GDALMetadata', Writable => 'string', WriteGroup => 'IFD0' }, #3
|
|
2977
2997
|
0xa481 => { Name => 'GDALNoData', Writable => 'string', WriteGroup => 'IFD0' }, #3
|
|
2978
2998
|
0xa500 => { Name => 'Gamma', Writable => 'rational64u' },
|
|
2999
|
+
# 0xa661 - string: ? (ExifIFD, Xiaomi)
|
|
2979
3000
|
0xafc0 => 'ExpandSoftware', #JD (Opanda)
|
|
2980
3001
|
0xafc1 => 'ExpandLens', #JD (Opanda)
|
|
2981
3002
|
0xafc2 => 'ExpandFilm', #JD (Opanda)
|
|
@@ -1468,12 +1468,15 @@ my %faceCategories = (
|
|
|
1468
1468
|
},
|
|
1469
1469
|
1 => { Name => 'RawImageNumber', Format => 'int32u' },
|
|
1470
1470
|
# 3 - seen "0 100", "-300 100" and "300 100" for a sequence of 3 images
|
|
1471
|
-
3 => { Name => '
|
|
1471
|
+
3 => { Name => 'ExposureCompensation', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
|
|
1472
1472
|
# 4 - (same value as 3 in all my samples)
|
|
1473
|
-
4 => { Name => '
|
|
1473
|
+
4 => { Name => 'ExposureCompensation2', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
|
|
1474
1474
|
# 5 - seen "10 1600", "10 6800", "10 200", "10 35000" etc
|
|
1475
|
+
5 => { Name => 'ExposureTime', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)' },
|
|
1475
1476
|
# 6 - seen "450 100", "400 100" (all images in RAF have same value)
|
|
1477
|
+
6 => { Name => 'FNumber', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)' },
|
|
1476
1478
|
# 7 - seen 200, 125, 250, 2000
|
|
1479
|
+
7 => 'ISO',
|
|
1477
1480
|
# 8 - seen 0
|
|
1478
1481
|
);
|
|
1479
1482
|
|
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
17
17
|
use Image::ExifTool::QuickTime;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.08';
|
|
20
20
|
|
|
21
21
|
sub ProcessGoPro($$$);
|
|
22
22
|
sub ProcessString($$$);
|
|
@@ -401,6 +401,21 @@ my %addUnits = (
|
|
|
401
401
|
ORIO => 'OutputOrientation',
|
|
402
402
|
UNIF => 'InputUniformity',
|
|
403
403
|
SROT => 'SensorReadoutTime',
|
|
404
|
+
# the following are ref https://exiftool.org/forum/index.php?topic=15517.0
|
|
405
|
+
CORI => { Name => 'CameraOrientation', Binary => 1, Notes => 'quaternions 0-1' },
|
|
406
|
+
AALP => { Name => 'AudioLevel', Notes => 'dBFS' },
|
|
407
|
+
GPSA => 'GPSAltitudeSystem', # (eg. 'MSLV')
|
|
408
|
+
GRAV => { Name => 'GravityVector', Binary => 1 },
|
|
409
|
+
HUES => 'PrediminantHue',
|
|
410
|
+
IORI => { Name => 'ImageOrientation', Binary => 1, Notes => 'quaternions 0-1' },
|
|
411
|
+
# LRVO - ? Part of LRV Frame Skip
|
|
412
|
+
# LRVS - ? Part of LRV Frame Skip
|
|
413
|
+
# LSKP - LRV Frame Skip
|
|
414
|
+
# MSKP - MRV Frame Skip
|
|
415
|
+
MWET => 'MicrophoneWet',
|
|
416
|
+
SCEN => 'SceneClassification', # (SNOW,URBA,INDO,WATR,VEGE,BEAC + probability)
|
|
417
|
+
WNDM => 'WindProcessing',
|
|
418
|
+
YAVG => 'LumaAverage',
|
|
404
419
|
);
|
|
405
420
|
|
|
406
421
|
# GoPro GPS5 tags (ref 2) (Hero5,Hero6)
|
|
@@ -18,7 +18,7 @@ use strict;
|
|
|
18
18
|
use vars qw($VERSION);
|
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
20
20
|
|
|
21
|
-
$VERSION = '1.
|
|
21
|
+
$VERSION = '1.60';
|
|
22
22
|
|
|
23
23
|
sub ProcessID3v2($$$);
|
|
24
24
|
sub ProcessPrivate($$$);
|
|
@@ -825,8 +825,8 @@ my %id3v2_common = (
|
|
|
825
825
|
|
|
826
826
|
# lookup to check for existence of tags in other ID3 versions
|
|
827
827
|
my %otherTable = (
|
|
828
|
-
\%Image::ExifTool::ID3::v2_4 =>
|
|
829
|
-
\%Image::ExifTool::ID3::v2_3 =>
|
|
828
|
+
\%Image::ExifTool::ID3::v2_4 => 'Image::ExifTool::ID3::v2_3',
|
|
829
|
+
\%Image::ExifTool::ID3::v2_3 => 'Image::ExifTool::ID3::v2_4',
|
|
830
830
|
);
|
|
831
831
|
|
|
832
832
|
# ID3 Composite tags
|
|
@@ -1098,6 +1098,7 @@ sub ProcessID3v2($$$)
|
|
|
1098
1098
|
my $vers = $$dirInfo{Version};
|
|
1099
1099
|
my $verbose = $et->Options('Verbose');
|
|
1100
1100
|
my $len; # frame data length
|
|
1101
|
+
my $otherTable;
|
|
1101
1102
|
|
|
1102
1103
|
$et->VerboseDir($tagTablePtr->{GROUPS}->{1}, 0, $size);
|
|
1103
1104
|
$et->VerboseDump($dataPt, Len => $size, Start => $offset);
|
|
@@ -1144,7 +1145,9 @@ sub ProcessID3v2($$$)
|
|
|
1144
1145
|
last if $offset + $len > $size;
|
|
1145
1146
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $id);
|
|
1146
1147
|
unless ($tagInfo) {
|
|
1147
|
-
|
|
1148
|
+
if (not $otherTable and $otherTable{$tagTablePtr}) {
|
|
1149
|
+
$otherTable = GetTagTable($otherTable{$tagTablePtr});
|
|
1150
|
+
}
|
|
1148
1151
|
$tagInfo = $et->GetTagInfo($otherTable, $id) if $otherTable;
|
|
1149
1152
|
if ($tagInfo) {
|
|
1150
1153
|
$et->WarnOnce("Frame '${id}' is not valid for this ID3 version", 1);
|
|
@@ -14,7 +14,7 @@ use vars qw($VERSION);
|
|
|
14
14
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
15
15
|
use Image::ExifTool::Import;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.06';
|
|
18
18
|
|
|
19
19
|
sub ProcessJSON($$);
|
|
20
20
|
sub ProcessTag($$$$%);
|
|
@@ -60,6 +60,9 @@ sub FoundTag($$$$%)
|
|
|
60
60
|
# avoid conflict with special table entries
|
|
61
61
|
$tag .= '!' if $Image::ExifTool::specialTags{$tag};
|
|
62
62
|
|
|
63
|
+
# use underline instead of colon if necessary in tag name
|
|
64
|
+
$tag =~ s/([A-Z]):([A-Z]{2})/${1}_$2/g;
|
|
65
|
+
|
|
63
66
|
AddTagToTable($tagTablePtr, $tag, {
|
|
64
67
|
Name => Image::ExifTool::MakeTagName($tag),
|
|
65
68
|
%flags,
|