exiftool_vendored 12.70.0 → 12.72.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8660bdc38a746e24a73d1b5a0b167250bce83398c78d24f4a2ef736b9bb7a5a4
4
- data.tar.gz: 8fc11e9218cf70d7ab1bf608b39bcd12693aea6c20bdaf3d31907a95ff21b626
3
+ metadata.gz: a1f510ba188ef652b3d3d2b5cf0a8f317c7ce8eb1ef27448b0de2d6ea326e67d
4
+ data.tar.gz: 8221ec58b898f84a00d6739e79a88417d83b57e481b473216d2a4001f34e7909
5
5
  SHA512:
6
- metadata.gz: 77b2a89162d45e272bb27aa0481c57ea95fae1e677081aad86976accda1492f622e46d789c39818e4de31b1e1fa8fb951c4687a20ecfe7d5435a98df30b73a19
7
- data.tar.gz: 9d59b5179a8b89b99456845bc087b643290efe2bcfddffbed73eb224b7fb7f669a43f1e5c29f60ae60bf3d00ac3142372cee21932c65d321e1868f35fa5e567e
6
+ metadata.gz: c294ea7e4739692d2e938409230f791474b64e427a494d0abc984165415dd59a18a3e33ec5c37a8deddbf809d61adc338936762993d6cd43462b717be22be5d3
7
+ data.tar.gz: 8083b7e1418ecf28253e5fef7ec3a1125e430b1235feb820cf85c7796af1d94a65ac7c5521ca36162916c4908da5f2f9a8a8598bf9ecf06d07c0d757166f21a4
data/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
- Nov. 19, 2023 - Version 12.70 (production release)
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
data/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
data/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.70"
53
+ "version" : "12.72"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: 0
32
32
  requires:
33
33
  perl: 5.004
34
- version: 12.70
34
+ version: 12.72
data/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 | DPX r | ITC r | NUMBERS r | RAW r/w
18
- 3FR r | DR4 r/w/c | J2C r | O r | RIFF r
19
- 3G2 r/w | DSS r | JNG r/w | ODP r | RSRC r
20
- 3GP r/w | DV r | JP2 r/w | ODS r | RTF r
21
- 7Z r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
22
- A r | DVR-MS r | JSON r | OFR r | RWL r/w
23
- AA r | DYLIB r | JXL r | OGG r | RWZ 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.70.tar.gz | tar -xf -
112
- cd Image-ExifTool-12.70
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.
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.70';
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 | DPX r | ITC r | NUMBERS r | RAW r/w
4632
- 3FR r | DR4 r/w/c | J2C r | O r | RIFF r
4633
- 3G2 r/w | DSS r | JNG r/w | ODP r | RSRC r
4634
- 3GP r/w | DV r | JP2 r/w | ODS r | RTF r
4635
- 7Z r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
4636
- A r | DVR-MS r | JSON r | OFR r | RWL r/w
4637
- AA r | DYLIB r | JXL r | OGG r | RWZ 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 compatable, and use B<-G> instead of B<-g>). Additionally,
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.70 --
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
- Composite tags may access tags from alternate files using the appropriate
6609
- (case-sensitive) family 8 group name.
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. Normally MakerNotes tags may not be deleted individually, but a
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.71';
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
- # we need the RFLensType values for the following...
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 EOS R6.',
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 Optimizater information (MakerNotes tag 0x4018) (ref PH)
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.46';
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, Xaiomi Redmi models)
1430
- # 0x221 - int32u: 0 (IFD0, Xaiomi Redmi models)
1431
- # 0x222 - int32u: 0 (IFD0, Xaiomi Redmi models)
1432
- # 0x223 - int32u: 0 (IFD0, Xaiomi Redmi models)
1433
- # 0x224 - int32u: 0,1 (IFD0, Xaiomi Redmi models)
1434
- # 0x225 - string: "" (IFD0, Xaiomi Redmi models)
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
- # 0x9999 - string: camera settings (ExifIFD, Xiaomi POCO F1)
2527
- # 0x9aaa - int8u[2176]: ? (ExifIFD, Xiaomi POCO F1)
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 => 'MRAW_0x0003', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
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 => 'MRAW_0x0004', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
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.07';
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.59';
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 => \%Image::ExifTool::ID3::v2_3,
829
- \%Image::ExifTool::ID3::v2_3 => \%Image::ExifTool::ID3::v2_4,
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
- my $otherTable = $otherTable{$tagTablePtr};
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);