exiftool-vendored.pl 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/Changes +36 -1
- package/bin/MANIFEST +5 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +10 -10
- package/bin/exiftool +21 -14
- package/bin/lib/Image/ExifTool/AAC.pm +175 -0
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +2 -1
- package/bin/lib/Image/ExifTool/Canon.pm +21 -6
- package/bin/lib/Image/ExifTool/Exif.pm +30 -9
- package/bin/lib/Image/ExifTool/FujiFilm.pm +5 -2
- package/bin/lib/Image/ExifTool/GoPro.pm +16 -1
- package/bin/lib/Image/ExifTool/ID3.pm +7 -4
- package/bin/lib/Image/ExifTool/JSON.pm +4 -1
- package/bin/lib/Image/ExifTool/M2TS.pm +21 -16
- package/bin/lib/Image/ExifTool/Nikon.pm +158 -90
- package/bin/lib/Image/ExifTool/Pentax.pm +15 -6
- package/bin/lib/Image/ExifTool/QuickTime.pm +29 -10
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +59 -11
- package/bin/lib/Image/ExifTool/Ricoh.pm +109 -1
- package/bin/lib/Image/ExifTool/Samsung.pm +3 -2
- package/bin/lib/Image/ExifTool/Sony.pm +83 -4
- package/bin/lib/Image/ExifTool/TagLookup.pm +4862 -4828
- package/bin/lib/Image/ExifTool/TagNames.pod +147 -42
- package/bin/lib/Image/ExifTool/WriteExif.pl +19 -4
- package/bin/lib/Image/ExifTool/Writer.pl +81 -14
- package/bin/lib/Image/ExifTool.pm +18 -6
- package/bin/lib/Image/ExifTool.pod +19 -14
- package/bin/perl-Image-ExifTool.spec +9 -9
- package/bin/pp_build_exe.args +5 -4
- package/package.json +4 -5
package/bin/Changes
CHANGED
|
@@ -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
|
package/bin/MANIFEST
CHANGED
|
@@ -41,6 +41,7 @@ fmt_files/kml_track.fmt
|
|
|
41
41
|
html/ExifTool.html
|
|
42
42
|
html/MIE1.1-20070121.pdf
|
|
43
43
|
html/Shift.html
|
|
44
|
+
html/TagNames/AAC.html
|
|
44
45
|
html/TagNames/AFCP.html
|
|
45
46
|
html/TagNames/AIFF.html
|
|
46
47
|
html/TagNames/APE.html
|
|
@@ -214,6 +215,7 @@ lib/File/RandomAccess.pod
|
|
|
214
215
|
lib/Image/ExifTool.pm
|
|
215
216
|
lib/Image/ExifTool.pod
|
|
216
217
|
lib/Image/ExifTool/7Z.pm
|
|
218
|
+
lib/Image/ExifTool/AAC.pm
|
|
217
219
|
lib/Image/ExifTool/AES.pm
|
|
218
220
|
lib/Image/ExifTool/AFCP.pm
|
|
219
221
|
lib/Image/ExifTool/AIFF.pm
|
|
@@ -441,6 +443,8 @@ lib/Image/ExifTool/ZIP.pm
|
|
|
441
443
|
lib/Image/ExifTool/ZISRAW.pm
|
|
442
444
|
lib/Image/ExifTool/iWork.pm
|
|
443
445
|
perl-Image-ExifTool.spec
|
|
446
|
+
t/AAC.t
|
|
447
|
+
t/AAC_2.out
|
|
444
448
|
t/AFCP.t
|
|
445
449
|
t/AFCP_2.out
|
|
446
450
|
t/AFCP_3.out
|
|
@@ -979,6 +983,7 @@ t/ZIP_7.out
|
|
|
979
983
|
t/ZIP_8.out
|
|
980
984
|
t/ZISRAW.t
|
|
981
985
|
t/ZISRAW_2.out
|
|
986
|
+
t/images/AAC.aac
|
|
982
987
|
t/images/AFCP.jpg
|
|
983
988
|
t/images/AIFF.aif
|
|
984
989
|
t/images/APE.ape
|
package/bin/META.json
CHANGED
package/bin/META.yml
CHANGED
package/bin/README
CHANGED
|
@@ -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.
|
package/bin/exiftool
CHANGED
|
@@ -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;
|
|
@@ -1642,7 +1642,10 @@ if (@newValues) {
|
|
|
1642
1642
|
if ($tag =~ /^(All)?TagsFromFile$/i) {
|
|
1643
1643
|
defined $newVal or Error("Need file name for -tagsFromFile\n"), next Command;
|
|
1644
1644
|
++$isWriting;
|
|
1645
|
-
if ($newVal eq '@' or not defined FilenameSPrintf($newVal)
|
|
1645
|
+
if ($newVal eq '@' or not defined FilenameSPrintf($newVal) or
|
|
1646
|
+
# can't set tags yet if we are using tags from other files with the -fileNUM option
|
|
1647
|
+
grep /\bfile\d+:/i, @{$setTags{$newVal}})
|
|
1648
|
+
{
|
|
1646
1649
|
push @dynamicFiles, $newVal;
|
|
1647
1650
|
next; # set tags from dynamic file later
|
|
1648
1651
|
}
|
|
@@ -4628,13 +4631,14 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
4628
4631
|
|
|
4629
4632
|
File Types
|
|
4630
4633
|
------------+-------------+-------------+-------------+------------
|
|
4631
|
-
360 r/w |
|
|
4632
|
-
3FR r |
|
|
4633
|
-
3G2 r/w |
|
|
4634
|
-
3GP r/w |
|
|
4635
|
-
7Z r |
|
|
4636
|
-
A r |
|
|
4637
|
-
AA r |
|
|
4634
|
+
360 r/w | DOCX r | ISO r | NRW r/w | RAR r
|
|
4635
|
+
3FR r | DPX r | ITC r | NUMBERS r | RAW r/w
|
|
4636
|
+
3G2 r/w | DR4 r/w/c | J2C r | O r | RIFF r
|
|
4637
|
+
3GP r/w | DSS r | JNG r/w | ODP r | RSRC r
|
|
4638
|
+
7Z r | DV r | JP2 r/w | ODS r | RTF r
|
|
4639
|
+
A r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
|
|
4640
|
+
AA r | DVR-MS r | JSON r | OFR r | RWL r/w
|
|
4641
|
+
AAC r | DYLIB r | JXL r | OGG r | RWZ r
|
|
4638
4642
|
AAE r | EIP r | K25 r | OGV r | RM r
|
|
4639
4643
|
AAX r/w | EPS r/w | KDC r | ONP r | SEQ r
|
|
4640
4644
|
ACR r | EPUB r | KEY r | OPUS r | SKETCH r
|
|
@@ -4670,7 +4674,6 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
4670
4674
|
DLL r | INSP r/w | MXF r | RA r | XLSX r
|
|
4671
4675
|
DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
|
|
4672
4676
|
DOC r | INX r | NKSC r/w | RAM r | ZIP r
|
|
4673
|
-
DOCX r | ISO r | NRW r/w | RAR r |
|
|
4674
4677
|
|
|
4675
4678
|
Meta Information
|
|
4676
4679
|
----------------------+----------------------+---------------------
|
|
@@ -5440,7 +5443,7 @@ tags specified for the specific SourceFile processed. The imported JSON
|
|
|
5440
5443
|
file must have the same format as the exported JSON files with the exception
|
|
5441
5444
|
that options exporting JSON objects instead of simple values are not
|
|
5442
5445
|
compatible with the import file format (ie. export with B<-D>, B<-H>, B<-l>,
|
|
5443
|
-
or B<-T> is not
|
|
5446
|
+
or B<-T> is not compatible, and use B<-G> instead of B<-g>). Additionally,
|
|
5444
5447
|
tag names in the input JSON file may be suffixed with a C<#> to disable
|
|
5445
5448
|
print conversion.
|
|
5446
5449
|
|
|
@@ -5582,7 +5585,7 @@ with this command:
|
|
|
5582
5585
|
|
|
5583
5586
|
produces output like this:
|
|
5584
5587
|
|
|
5585
|
-
-- Generated by ExifTool 12.
|
|
5588
|
+
-- Generated by ExifTool 12.72 --
|
|
5586
5589
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5587
5590
|
(f/5.6, 1/60s, ISO 100)
|
|
5588
5591
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6605,8 +6608,12 @@ Rights from the original file could look like this:
|
|
|
6605
6608
|
|
|
6606
6609
|
exiftool -file1 '$originalfilename' '-rights<file1:rights' edited.jpg
|
|
6607
6610
|
|
|
6608
|
-
|
|
6609
|
-
|
|
6611
|
+
Subtle note: If a B<-tagsFromFile> option is used, tags in the I<ALTFILE>
|
|
6612
|
+
argument come from the I<SRCFILE> that applies to the first argument
|
|
6613
|
+
accessing tags from the corresponding C<FileNUM> group.
|
|
6614
|
+
|
|
6615
|
+
User-defined Composite tags may access tags from alternate files using the
|
|
6616
|
+
appropriate (case-sensitive) family 8 group name.
|
|
6610
6617
|
|
|
6611
6618
|
=item B<-list_dir>
|
|
6612
6619
|
|
|
@@ -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);
|