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.
Files changed (26) hide show
  1. package/bin/exiftool_files/Changes +36 -1
  2. package/bin/exiftool_files/README +10 -10
  3. package/bin/exiftool_files/exiftool.pl +19 -14
  4. package/bin/exiftool_files/lib/Image/ExifTool/AAC.pm +175 -0
  5. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +2 -1
  6. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +21 -6
  7. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +30 -9
  8. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +5 -2
  9. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
  10. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +7 -4
  11. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +4 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +21 -16
  13. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +158 -90
  14. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +15 -6
  15. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +29 -10
  16. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +59 -11
  17. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +109 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +3 -2
  19. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +83 -4
  20. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4862 -4828
  21. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +147 -42
  22. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +19 -4
  23. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +81 -14
  24. package/bin/exiftool_files/lib/Image/ExifTool.pm +18 -6
  25. package/bin/exiftool_files/lib/Image/ExifTool.pod +19 -14
  26. 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
- 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
@@ -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.
@@ -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;
@@ -4636,13 +4636,14 @@ DESCRIPTION
4636
4636
 
4637
4637
  File Types
4638
4638
  ------------+-------------+-------------+-------------+------------
4639
- 360 r/w | DPX r | ITC r | NUMBERS r | RAW r/w
4640
- 3FR r | DR4 r/w/c | J2C r | O r | RIFF r
4641
- 3G2 r/w | DSS r | JNG r/w | ODP r | RSRC r
4642
- 3GP r/w | DV r | JP2 r/w | ODS r | RTF r
4643
- 7Z r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
4644
- A r | DVR-MS r | JSON r | OFR r | RWL r/w
4645
- AA r | DYLIB r | JXL r | OGG r | RWZ 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 compatable, and use -G instead of
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.70 --
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 "$originalfilename" "-rights<file1:rights" edited.jpg
6609
+ exiftool -file1 '$originalfilename' '-rights<file1:rights' edited.jpg
6610
6610
 
6611
- Composite tags may access tags from alternate files using the
6612
- appropriate (case-sensitive) family 8 group name.
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. 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);
@@ -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.05';
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,