exiftool-vendored.pl 12.69.0 → 12.70.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 (37) hide show
  1. package/bin/Changes +43 -12
  2. package/bin/META.json +1 -1
  3. package/bin/META.yml +1 -1
  4. package/bin/README +2 -2
  5. package/bin/exiftool +13 -13
  6. package/bin/lib/Image/ExifTool/CBOR.pm +18 -2
  7. package/bin/lib/Image/ExifTool/Canon.pm +63 -16
  8. package/bin/lib/Image/ExifTool/DJI.pm +3 -2
  9. package/bin/lib/Image/ExifTool/EXE.pm +54 -6
  10. package/bin/lib/Image/ExifTool/Exif.pm +82 -3
  11. package/bin/lib/Image/ExifTool/FujiFilm.pm +142 -20
  12. package/bin/lib/Image/ExifTool/GIF.pm +5 -1
  13. package/bin/lib/Image/ExifTool/ID3.pm +70 -7
  14. package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  15. package/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  16. package/bin/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  17. package/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  18. package/bin/lib/Image/ExifTool/Nikon.pm +45 -12
  19. package/bin/lib/Image/ExifTool/Olympus.pm +7 -1
  20. package/bin/lib/Image/ExifTool/PNG.pm +8 -13
  21. package/bin/lib/Image/ExifTool/Panasonic.pm +10 -1
  22. package/bin/lib/Image/ExifTool/QuickTime.pm +31 -4
  23. package/bin/lib/Image/ExifTool/README +7 -2
  24. package/bin/lib/Image/ExifTool/RIFF.pm +53 -9
  25. package/bin/lib/Image/ExifTool/Sony.pm +95 -34
  26. package/bin/lib/Image/ExifTool/TagLookup.pm +6927 -6856
  27. package/bin/lib/Image/ExifTool/TagNames.pod +435 -304
  28. package/bin/lib/Image/ExifTool/Text.pm +4 -5
  29. package/bin/lib/Image/ExifTool/Validate.pm +6 -5
  30. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
  31. package/bin/lib/Image/ExifTool/WriteRIFF.pl +9 -3
  32. package/bin/lib/Image/ExifTool/Writer.pl +21 -36
  33. package/bin/lib/Image/ExifTool.pm +59 -33
  34. package/bin/lib/Image/ExifTool.pod +9 -3
  35. package/bin/perl-Image-ExifTool.spec +1 -1
  36. package/bin/pp_build_exe.args +4 -4
  37. package/package.json +2 -2
package/bin/Changes CHANGED
@@ -4,9 +4,37 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 12.60. (Other versions are
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)
11
+
12
+ - This marks the 20th anniversary of the initial ExifTool release!
13
+ - Added ability to read/delete C2PA CAI JUMBF metadata from TIFF-based images
14
+ (eg. DNG), QuickTime-based files (eg. MP4) and WebP images, and read JUMBF
15
+ from other RIFF-based files (eg. WAV, AVI), GIF images and ID3v2 metadata
16
+ - Added read/write support for JPH images
17
+ - Added ability to read Leica Q3 maker notes
18
+ - Added ability to recognize and write FujiFilm M-RAW RAF images (multiple raw
19
+ images in a single file) and the ability to read preview-less RAF images
20
+ - Added support for reading a number of obscure Microsoft EXIF tags
21
+ - Added a few new Sony lenses and support for the ILCE-9M3 (thanks Jos Roost)
22
+ - Added a couple of new Panasonic Leica lenses
23
+ - Added a couple of new Canon RF lenses (thanks Norbert Wasser)
24
+ - Added a number of new CPUType values for ELF executables
25
+ - Added some new Olympus CameraType values
26
+ - Decode a few more ID3v2.2 tags (github #142)
27
+ - Decode a few new Canon G5X Mark II tags (thanks Martin B.)
28
+ - Decode WB_RGGBLevels for a few more Nikon cameras
29
+ - Extract information from FujiFilm M-RAW header
30
+ - Improved decoding of a few Nikon Z tags (thanks Warren Hatch)
31
+ - Marked misspelt XMP-drone-dji:GPSLongtitude tag to Avoid when writing
32
+ - Changed RIFF MaxDataRate conversion to use SI prefixes by default
33
+ - Fixed decoding of unknown ColorBalance information for some Nikon models
34
+ - Fixed an incorrect Nikon Z LensID
35
+ - API Changes:
36
+ - Added ByteUnit option
37
+
10
38
  Oct. 26, 2023 - Version 12.69
11
39
 
12
40
  - Added support for DNG version 1.7.0.0
@@ -19,6 +47,11 @@ Oct. 26, 2023 - Version 12.69
19
47
  Hasselblad programmers (wrong IFD count for some values)
20
48
  - Patched WebP reader to be more tolerant of the mess made by incompetent
21
49
  Google programmers (EXIF with wrong header and XMP with wrong ID)
50
+ - Fixed writing of MakerNotes as a block to CR3 images (now properly stored in
51
+ the CMT3 chunk instead of the ExifIFD) and added ability to delete them from
52
+ the ExifIFD of CR3 images
53
+ - Fixed problem which could cause runtime error when copying MakerNotes from a
54
+ file that contains multiple maker note blocks
22
55
  - Fixed problem which could cause "use of uninitialized variable" warnings
23
56
  when reading images from some Nikon cameras
24
57
  - Fixed List type for new XMP-photomech:CreatorIdentity tag
@@ -26,7 +59,7 @@ Oct. 26, 2023 - Version 12.69
26
59
  Oct. 16, 2023 - Version 12.68
27
60
 
28
61
  - Added preliminary read support for XISF images
29
- - Added the ability to delete JUMBF metadata from PNG images
62
+ - Added the ability to delete CAI JUMBF metadata from PNG images
30
63
  - Added support for writing Canon burst-roll CR3 images
31
64
  - Added a new Nikon Z9 SubjectDetection value, and improved Zf support (thanks
32
65
  Warren Hatch)
@@ -38,7 +71,7 @@ Oct. 16, 2023 - Version 12.68
38
71
  - Added a new Canon LensType
39
72
  - Support decimal values for FujiFilm ShadowTone and HighlightTone tags
40
73
  - Decode some new Sony tags (thanks Jos Roost)
41
- - Decode ShutterCount for Canon EOS R6 (thanks gamin)
74
+ - Decode ShutterCount for Canon EOS R6 (thanks Martin B.)
42
75
  - Decode QuickTime VideoFullRangeFlag
43
76
  - Decode JPGCompression for the Nikon D3S
44
77
  - Enhanced -geotag feature to allow writing QuickTime:GPSCoordinates
@@ -193,8 +226,6 @@ Apr. 5, 2023 - Version 12.60 (production release)
193
226
  - Fixed problem where setting the Geotime value didn't work when using an
194
227
  advanced-formatting expression containing a greater-than symbol (>)
195
228
 
196
- History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
197
-
198
229
  Mar. 28, 2023 - Version 12.59
199
230
 
200
231
  - COMPATIBILITY WARNING: Changed the calculated ImageDataMD5 for JPEG images
@@ -324,7 +355,7 @@ Dec. 6, 2022 - Version 12.52
324
355
  Nov. 21, 2022 - Version 12.51
325
356
 
326
357
  - Added a new Olympus LensType (thanks Herb)
327
- - Extract C2PA JUMBF metadata from PNG images and extract C2PA Salt values
358
+ - Extract C2PA CAI JUMBF metadata from PNG images and extract C2PA Salt values
328
359
  - Decode NikonSettings for Z9 firmware 3.0 (thanks Warren Hatch)
329
360
  - Decode additional camm metadata from Insta360 Pro2 MP4 videos
330
361
  - Improved Verbose output when writing Composite tags to add a "+" sign to
@@ -707,8 +738,8 @@ Oct. 16, 2021 - Version 12.33
707
738
 
708
739
  Sept. 30, 2021 - Version 12.32
709
740
 
710
- - Added support for CBOR-format metadata in JUMBF (note that JUMBF support is
711
- still experimental)
741
+ - Added support for CBOR-format metadata in CAI JUMBF (note that JUMBF support
742
+ is still experimental)
712
743
  - Added a new Nikon LensID
713
744
  - Added a new Pentax LensType
714
745
  - Decode timed GPS for two more dashcam formats
@@ -767,7 +798,7 @@ July 9, 2021 - Version 12.29
767
798
  - Improved a QuickTime "File format error" message to be more meaningful, and
768
799
  made it a minor error
769
800
  - Changed PNG writer to add EXIF before IDAT
770
- - Some changes the way JUMBF metadata is handled
801
+ - Some changes the way CAI JUMBF metadata is handled
771
802
  - Patched to read timed GPS from a different type of INSV videos
772
803
  - Patched a security issue
773
804
  - Fixed problem where ExifTool could hang when processing mebx timed metadata
@@ -843,7 +874,7 @@ Apr. 13, 2021 - Version 12.24
843
874
  - Decode a few new Panasonic and FujiFilm tags (thanks LibRaw and Greybeard)
844
875
  - Updated acdsee.config in distribution (thanks StarGeek)
845
876
  - Recognize AutoCAD DXF files
846
- - More work on experimental JUMBF read support
877
+ - More work on experimental CAI JUMBF read support
847
878
  - More work on experimental JPEG XL read/write support
848
879
  - Patched security vulnerability in DjVu reader
849
880
 
@@ -851,8 +882,8 @@ Apr. 1, 2021 - Version 12.23
851
882
 
852
883
  - Added support for Olympus ORI files
853
884
  - Added experimental read/write support for JPEG XL images
854
- - Added experimental read support for JUMBF metadata in JPEG and Jpeg2000
855
- images
885
+ - Added experimental read support for CAI (Content Authenticity Initiative)
886
+ JUMBF-format metadata in JPEG and Jpeg2000 images
856
887
  - Added built-in support for parsing GPS track from Denver ACG-8050 videos
857
888
  with the -ee option
858
889
  - Added a some new Sony lenses (thanks Jos Roost and LibRaw)
package/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.69"
53
+ "version" : "12.70"
54
54
  }
package/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.69
34
+ version: 12.70
package/bin/README CHANGED
@@ -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.69.tar.gz | tar -xf -
112
- cd Image-ExifTool-12.69
111
+ gzip -dc Image-ExifTool-12.70.tar.gz | tar -xf -
112
+ cd Image-ExifTool-12.70
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.69';
14
+ my $version = '12.70';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -4738,7 +4738,7 @@ L<Input-output text formatting|/Input-output text formatting>
4738
4738
  -n (--printConv) No print conversion
4739
4739
  -p FMTFILE (-printFormat) Print output in specified format
4740
4740
  -php Export tags as a PHP Array
4741
- -s[NUM] (-short) Short output format
4741
+ -s[NUM] (-short) Short output format (-s for tag names)
4742
4742
  -S (-veryShort) Very short output format
4743
4743
  -sep STR (-separator) Set separator string for list items
4744
4744
  -sort Sort output alphabetically
@@ -4951,7 +4951,7 @@ while C<-all:all=> deletes entire blocks.
4951
4951
  application segments which are not associated with another deletable group.
4952
4952
  For example, specifying C<-APP14:All=> will NOT delete the APP14 "Adobe"
4953
4953
  segment because this is accomplished with C<-Adobe:All>. But note that
4954
- these unnamed APP segments may not be excluded with C<--APPxx:all>) when
4954
+ these unnamed APP segments may not be excluded with C<--APPxx:all> when
4955
4955
  deleting all information.
4956
4956
 
4957
4957
  6) When shifting a value, the shift is applied to the original value of the
@@ -5582,7 +5582,7 @@ with this command:
5582
5582
 
5583
5583
  produces output like this:
5584
5584
 
5585
- -- Generated by ExifTool 12.69 --
5585
+ -- Generated by ExifTool 12.70 --
5586
5586
  File: a.jpg - 2003:10:31 15:44:19
5587
5587
  (f/5.6, 1/60s, ISO 100)
5588
5588
  File: b.jpg - 2006:05:23 11:57:38
@@ -6593,15 +6593,15 @@ option no longer suppresses the output "{readyNUM}" message.
6593
6593
 
6594
6594
  Read tags from an alternate source file. Among other things, this allows
6595
6595
  tags from different files to be compared and combined using the B<-if> and
6596
- B<-p> options. Tags from alternate files are accessed via the corresponding
6597
- family 8 group name (eg. C<File1:TAG> for the B<-file1> option, C<File2:TAG>
6598
- for B<-file2>, etc). I<ALTFILE> may contain filename formatting codes like
6599
- the B<-w> option (%d, %f, etc), and/or tag names with a leading C<$> symbol
6600
- to access tags from the source file in the same way as the B<-p> option (so
6601
- any other dollar symbol in the file name must be doubled, eg.
6602
- C<money$$.jpg>). For example, assuming that the OriginalFileName tag has
6603
- been set in the edited file, a command to copy Rights from the original file
6604
- could look like this:
6596
+ B<-p> options. I<NUM> is any string of digits. Tags from alternate files
6597
+ are accessed via the corresponding family 8 group name (eg. C<File1:TAG> for
6598
+ the B<-file1> option, C<File2:TAG> for B<-file2>, etc). I<ALTFILE> may
6599
+ contain filename formatting codes like the B<-w> option (%d, %f, etc),
6600
+ and/or tag names with a leading C<$> symbol to access tags from the source
6601
+ file in the same way as the B<-p> option (so any other dollar symbol in the
6602
+ file name must be doubled, eg. C<money$$.jpg>). For example, assuming that
6603
+ the OriginalFileName tag has been set in the edited file, a command to copy
6604
+ Rights from the original file could look like this:
6605
6605
 
6606
6606
  exiftool -file1 '$originalfilename' '-rights<file1:rights' edited.jpg
6607
6607
 
@@ -7,6 +7,7 @@
7
7
  #
8
8
  # References: 1) https://c2pa.org/public-draft/
9
9
  # 2) https://datatracker.ietf.org/doc/html/rfc7049
10
+ # 3) https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml
10
11
  #------------------------------------------------------------------------------
11
12
 
12
13
  package Image::ExifTool::CBOR;
@@ -15,7 +16,7 @@ use vars qw($VERSION);
15
16
  use Image::ExifTool qw(:DataAccess :Utils);
16
17
  use Image::ExifTool::JSON;
17
18
 
18
- $VERSION = '1.01';
19
+ $VERSION = '1.02';
19
20
 
20
21
  sub ProcessCBOR($$$);
21
22
  sub ReadCBORValue($$$$);
@@ -28,15 +29,27 @@ my %cborType6 = (
28
29
  3 => 'negative bignum',
29
30
  4 => 'decimal fraction',
30
31
  5 => 'bigfloat',
32
+ 16 => 'COSE Encrypt0', #3 (COSE Single Recipient Encrypted Data Object)
33
+ 17 => 'COSE Mac0', #3 (COSE Mac w/o Recipients Object)
34
+ 18 => 'COSE Sign1', #3 (COSE Single Signer Data Object)
35
+ 19 => 'COSE Countersignature', #3 (COSE standalone V2 countersignature)
31
36
  21 => 'expected base64url encoding',
32
37
  22 => 'expected base64 encoding',
33
38
  23 => 'expected base16 encoding',
34
39
  24 => 'encoded CBOR data',
40
+ 25 => 'string number', #3 (reference the nth previously seen string)
41
+ 26 => 'serialized Perl', #3 (Serialised Perl object with classname and constructor arguments)
42
+ 27 => 'serialized code', #3 (Serialised language-independent object with type name and constructor arguments)
43
+ 28 => 'shared value', #3 (mark value as (potentially) shared)
44
+ 29 => 'shared value number', #3 (reference nth marked value)
45
+ 30 => 'rational', #3 (Rational number)
46
+ 31 => 'missing array value', #3 (Absent value in a CBOR Array)
35
47
  32 => 'URI',
36
48
  33 => 'base64url',
37
49
  34 => 'base64',
38
50
  35 => 'regular expression',
39
51
  36 => 'MIME message',
52
+ # (lots more after this in ref 3, but don't include them unless we see them)
40
53
  55799 => 'CBOR magic number',
41
54
  );
42
55
 
@@ -212,7 +225,7 @@ sub ReadCBORValue($$$$)
212
225
  {
213
226
  $val = $$val[1] * ($num == 4 ? 10 : 2) ** $$val[0];
214
227
  }
215
- } elsif ($fmt == 7) {
228
+ } elsif ($fmt == 7) {
216
229
  if ($dat == 31) {
217
230
  undef $val; # "break" = end of indefinite array/hash (not used in C2PA)
218
231
  } elsif ($dat < 24) {
@@ -263,6 +276,7 @@ sub ProcessCBOR($$$)
263
276
  my ($val, $err, $tag, $i);
264
277
 
265
278
  $et->VerboseDir('CBOR', undef, $$dirInfo{DirLen});
279
+ SetByteOrder('MM');
266
280
 
267
281
  $$et{cbor_datapos} = $$dirInfo{DataPos} + $$dirInfo{Base};
268
282
 
@@ -320,6 +334,8 @@ under the same terms as Perl itself.
320
334
 
321
335
  =item L<https://datatracker.ietf.org/doc/html/rfc7049>
322
336
 
337
+ =item L<https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml>
338
+
323
339
  =back
324
340
 
325
341
  =head1 SEE ALSO
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.70';
91
+ $VERSION = '4.71';
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)
@@ -611,22 +611,23 @@ $VERSION = '4.70';
611
611
  '61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
612
612
  '61182.36' => 'Canon RF 600mm F4L IS USM + RF1.4x', #42
613
613
  '61182.37' => 'Canon RF 600mm F4L IS USM + RF2x', #42
614
- '61182.38' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
615
- '61182.39' => 'Canon RF 800mm F5.6L IS USM', #42
616
- '61182.40' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
617
- '61182.41' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
618
- '61182.42' => 'Canon RF 1200mm F8L IS USM', #42
619
- '61182.43' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
620
- '61182.44' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
621
- '61182.45' => 'Canon RF 135mm F1.8 L IS USM', #42
622
- '61182.46' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
623
- '61182.47' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
624
- '61182.48' => 'Canon RF 100-300mm F2.8L IS USM', #42
625
- '61182.49' => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
626
- '61182.50' => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
627
- '61182.51' => 'Canon RF 28mm F2.8 STM', #42
614
+ '61182.38' => 'Canon RF 800mm F5.6L IS USM', #42
615
+ '61182.39' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
616
+ '61182.40' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
617
+ '61182.41' => 'Canon RF 1200mm F8L IS USM', #42
618
+ '61182.42' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
619
+ '61182.43' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
620
+ '61182.44' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH
621
+ '61182.45' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
622
+ '61182.46' => 'Canon RF 135mm F1.8 L IS USM', #42
623
+ '61182.47' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
624
+ '61182.48' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
625
+ '61182.49' => 'Canon RF 100-300mm F2.8L IS USM', #42
626
+ '61182.50' => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
627
+ '61182.51' => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
628
+ '61182.52' => 'Canon RF 10-20mm F4 L IS STM', #42
629
+ '61182.53' => 'Canon RF 28mm F2.8 STM', #42
628
630
  # we need the RFLensType values for the following...
629
- '61182.52' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
630
631
  65535 => 'n/a',
631
632
  );
632
633
 
@@ -1395,6 +1396,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1395
1396
  Condition => '$$self{Model} =~ /\bEOS R6$/',
1396
1397
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6' },
1397
1398
  },
1399
+ {
1400
+ Name => 'CanonCameraInfoG5XII',
1401
+ Condition => '$$self{Model} =~ /\bG5 X Mark II$/',
1402
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoG5XII' },
1403
+ },
1398
1404
  {
1399
1405
  Name => 'CanonCameraInfoPowerShot',
1400
1406
  # valid if format is int32u[138] or int32u[148]
@@ -4714,6 +4720,44 @@ my %ciMaxFocal = (
4714
4720
  },
4715
4721
  );
4716
4722
 
4723
+ # ref https://exiftool.org/forum/index.php?topic=15356.0
4724
+ %Image::ExifTool::Canon::CameraInfoG5XII = (
4725
+ %binaryDataAttrs,
4726
+ FIRST_ENTRY => 0,
4727
+ PRIORITY => 0,
4728
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4729
+ NOTES => 'CameraInfo tags for the EOS R6.',
4730
+ 0x0293 => {
4731
+ Name => 'ShutterCount',
4732
+ Format => 'int32u',
4733
+ Notes => 'includes electronic + mechanical shutter',
4734
+ # - advances by 1 for each photo file, regardless of mechanical or electronic shutter
4735
+ # - does not advance for regular video files
4736
+ # - advances for time lapse video files
4737
+ # - creating a new directory or resetting the counter from the menu doesn't affect this shutter count
4738
+ },
4739
+ 0x0b21 => {
4740
+ Name => 'DirectoryIndex',
4741
+ Groups => { 2 => 'Image' },
4742
+ Format => 'int32u',
4743
+ },
4744
+ 0x0b2d => {
4745
+ Name => 'FileIndex',
4746
+ Format => 'int32u',
4747
+ Groups => { 2 => 'Image' },
4748
+ Format => 'int32u',
4749
+ ValueConv => '$val + 1',
4750
+ ValueConvInv => '$val - 1',
4751
+ },
4752
+ #0x0b39 => {
4753
+ # Name => 'DirectoryIndex',
4754
+ # Groups => { 2 => 'Image' },
4755
+ # Format => 'int32u',
4756
+ # ValueConv => '$val - 1',
4757
+ # ValueConvInv => '$val + 1',
4758
+ #},
4759
+ );
4760
+
4717
4761
  # Canon camera information for 70D (MakerNotes tag 0x0d) (ref PH)
4718
4762
  %Image::ExifTool::Canon::CameraInfo70D = (
4719
4763
  %binaryDataAttrs,
@@ -6898,6 +6942,7 @@ my %ciMaxFocal = (
6898
6942
  298 => 'Canon RF 1200mm F8L IS USM', #42
6899
6943
  299 => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
6900
6944
  300 => 'Canon RF 1200mm F8L IS USM + RF2x', #42
6945
+ 301 => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH
6901
6946
  302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
6902
6947
  303 => 'Canon RF 135mm F1.8 L IS USM', #42
6903
6948
  304 => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
@@ -6905,6 +6950,7 @@ my %ciMaxFocal = (
6905
6950
  306 => 'Canon RF 100-300mm F2.8L IS USM', #42
6906
6951
  307 => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
6907
6952
  308 => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
6953
+ 312 => 'Canon RF 10-20mm F4 L IS STM', #42
6908
6954
  313 => 'Canon RF 28mm F2.8 STM', #42
6909
6955
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6910
6956
  },
@@ -9107,6 +9153,7 @@ my %filterConv = (
9107
9153
  MakerNotes => 1,
9108
9154
  SubDirectory => {
9109
9155
  TagTable => 'Image::ExifTool::Canon::Main',
9156
+ DirName => 'MakerNotes', # (necessary for mechanism that prevents these from being deleted)
9110
9157
  ProcessProc => \&ProcessCMT3,
9111
9158
  WriteProc => \&Image::ExifTool::WriteTIFF,
9112
9159
  },
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
16
16
  use Image::ExifTool::XMP;
17
17
  use Image::ExifTool::GPS;
18
18
 
19
- $VERSION = '1.08';
19
+ $VERSION = '1.09';
20
20
 
21
21
  sub ProcessDJIInfo($$$);
22
22
 
@@ -143,9 +143,10 @@ my %convFloat2 = (
143
143
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
144
144
  PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
145
145
  },
146
- GpsLongtitude => { # (sic)
146
+ GpsLongtitude => { # [sic] (misspelt in DJI original file)
147
147
  Name => 'GPSLongtitude',
148
148
  Writable => 'real',
149
+ Avoid => 1, # (in case someone tries to write "GPSLong*")
149
150
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
150
151
  PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
151
152
  },
@@ -21,7 +21,7 @@ use strict;
21
21
  use vars qw($VERSION);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
 
24
- $VERSION = '1.18';
24
+ $VERSION = '1.19';
25
25
 
26
26
  sub ProcessPEResources($$);
27
27
  sub ProcessPEVersion($$);
@@ -726,6 +726,7 @@ my %languageCode = (
726
726
  Name => 'CPUType',
727
727
  Format => 'int16u',
728
728
  # ref /usr/include/linux/elf-em.h
729
+ # ref https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
729
730
  PrintConv => {
730
731
  0 => 'None',
731
732
  1 => 'AT&T WE 32100',
@@ -736,21 +737,68 @@ my %languageCode = (
736
737
  6 => 'i486',
737
738
  7 => 'i860',
738
739
  8 => 'MIPS R3000',
740
+ 9 => 'IBM System/370',
739
741
  10 => 'MIPS R4000',
740
- 15 => 'HPPA',
742
+ 15 => 'HP PA-RISC',
741
743
  18 => 'Sun v8plus',
744
+ 19 => 'Intel 80960',
742
745
  20 => 'PowerPC',
743
746
  21 => 'PowerPC 64-bit',
744
747
  22 => 'IBM S/390',
745
748
  23 => 'Cell BE SPU',
749
+ 36 => 'NEC V800',
750
+ 37=> 'Fujitsu FR20',
751
+ 38 => 'TRW RH-32',
752
+ 39 => 'Motorola RCE',
753
+ 40 => 'Arm (up to Armv7/AArch32)',
754
+ 41 => 'Digital Alpha',
746
755
  42 => 'SuperH',
747
756
  43 => 'SPARC v9 64-bit',
757
+ 44 => 'Siemens TriCore',
758
+ 45 => 'Argonaut RISC Core',
748
759
  46 => 'Renesas H8/300,300H,H8S',
760
+ 47 => 'Hitachi H8/300H',
761
+ 48 => 'Hitachi H8S',
762
+ 49 => 'Hitachi H8/500',
749
763
  50 => 'HP/Intel IA-64',
750
- 62 => 'AMD x86-64',
751
- 76 => 'Axis Communications 32-bit embedded processor',
752
- 87 => 'NEC v850',
753
- 88 => 'Renesas M32R',
764
+ 0x33 => 'Stanford MIPS-X',
765
+ 0x34 => 'Motorola ColdFire',
766
+ 0x35 => 'Motorola M68HC12',
767
+ 0x36 => 'Fujitsu MMA Multimedia Accelerator',
768
+ 0x37 => 'Siemens PCP',
769
+ 0x38 => 'Sony nCPU embedded RISC processor',
770
+ 0x39 => 'Denso NDR1 microprocessor',
771
+ 0x3a => 'Motorola Star*Core processor',
772
+ 0x3b => 'Toyota ME16 processor',
773
+ 0x3c => 'STMicroelectronics ST100 processor',
774
+ 0x3d => 'Advanced Logic Corp. TinyJ embedded processor family',
775
+ 0x3e => 'AMD x86-64',
776
+ 0x3f => 'Sony DSP Processor',
777
+ 0x40 => 'Digital Equipment Corp. PDP-10',
778
+ 0x41 => 'Digital Equipment Corp. PDP-11',
779
+ 0x42 => 'Siemens FX66 microcontroller',
780
+ 0x43 => 'STMicroelectronics ST9+ 8/16 bit microcontroller',
781
+ 0x44 => 'STMicroelectronics ST7 8-bit microcontroller',
782
+ 0x45 => 'Motorola MC68HC16 Microcontroller',
783
+ 0x46 => 'Motorola MC68HC11 Microcontroller',
784
+ 0x47 => 'Motorola MC68HC08 Microcontroller',
785
+ 0x48 => 'Motorola MC68HC05 Microcontroller',
786
+ 0x49 => 'Silicon Graphics SVx',
787
+ 0x4a => 'STMicroelectronics ST19 8-bit microcontroller',
788
+ 0x4b => 'Digital VAX',
789
+ 0x4c => 'Axis Communications 32-bit embedded processor',
790
+ 0x4d => 'Infineon Technologies 32-bit embedded processor',
791
+ 0x4e => 'Element 14 64-bit DSP Processor',
792
+ 0x4f => 'LSI Logic 16-bit DSP Processor',
793
+ 0x57 => 'NEC v850',
794
+ 0x58 => 'Renesas M32R',
795
+ 0x8c => 'TMS320C6000 Family',
796
+ 0xaf => 'MCST Elbrus e2k',
797
+ 0xb7 => 'Arm 64-bits (Armv8/AArch64)',
798
+ 0xdc => 'Zilog Z80',
799
+ 0xf3 => 'RISC-V',
800
+ 0xf7 => 'Berkeley Packet Filter',
801
+ 0x101 => 'WDC 65C816',
754
802
  0x5441 => 'Fujitsu FR-V',
755
803
  0x9026 => 'Alpha', # (interim value)
756
804
  0x9041 => 'm32r (old)',
@@ -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.45';
60
+ $VERSION = '4.46';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -1005,7 +1005,7 @@ my %opcodeInfo = (
1005
1005
  },
1006
1006
  0x14d => 'InkNames', #3
1007
1007
  0x14e => 'NumberofInks', #3
1008
- 0x150 => 'DotRange',
1008
+ 0x150 => 'DotRange', # (int8u or int16u)
1009
1009
  0x151 => {
1010
1010
  Name => 'TargetPrinter',
1011
1011
  Writable => 'string',
@@ -1492,6 +1492,75 @@ my %opcodeInfo = (
1492
1492
  WriteGroup => 'IFD0',
1493
1493
  Avoid => 1,
1494
1494
  },
1495
+ # tags 0x5XXX are obscure tags defined by Microsoft:
1496
+ # ref https://learn.microsoft.com/en-us/previous-versions/windows/embedded/ms932271(v=msdn.10)
1497
+ # ref https://learn.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-constant-property-item-descriptions
1498
+ 0x5001 => { Name => 'ResolutionXUnit', Notes => "ID's from 0x5001 to 0x5113 are obscure tags defined by Microsoft" }, # (int16u)
1499
+ 0x5002 => 'ResolutionYUnit', # (int16u)
1500
+ 0x5003 => 'ResolutionXLengthUnit', # (int16u)
1501
+ 0x5004 => 'ResolutionYLengthUnit', # (int16u)
1502
+ 0x5005 => 'PrintFlags', # (string)
1503
+ 0x5006 => 'PrintFlagsVersion', # (int16u)
1504
+ 0x5007 => 'PrintFlagsCrop', # (int8u)
1505
+ 0x5008 => 'PrintFlagsBleedWidth', # (int32u)
1506
+ 0x5009 => 'PrintFlagsBleedWidthScale', # (int16u)
1507
+ 0x500a => 'HalftoneLPI', # (rational64u)
1508
+ 0x500b => 'HalftoneLPIUnit', # (int16u, 1=inch, 2=cm)
1509
+ 0x500c => 'HalftoneDegree', # (rational64u)
1510
+ 0x500d => 'HalftoneShape', # (int16u,0=round,1=Ellipse,2=Line,3=Square,4=Cross,5=Diamond)
1511
+ 0x500e => 'HalftoneMisc', # (int32u)
1512
+ 0x500f => 'HalftoneScreen', # (int8u)
1513
+ 0x5010 => 'JPEGQuality', # (int32u[N])
1514
+ 0x5011 => { Name => 'GridSize', Binary => 1 }, # (undef)
1515
+ 0x5012 => 'ThumbnailFormat', # (int32u,1=raw RGB,2=JPEG)
1516
+ 0x5013 => 'ThumbnailWidth', # (int32u)
1517
+ 0x5014 => 'ThumbnailHeight', # (int32u)
1518
+ 0x5015 => 'ThumbnailColorDepth', # (int16u)
1519
+ 0x5016 => 'ThumbnailPlanes', # (int16u)
1520
+ 0x5017 => 'ThumbnailRawBytes', # (int32u)
1521
+ 0x5018 => 'ThumbnailLength', # (int32u)
1522
+ 0x5019 => 'ThumbnailCompressedSize', # (int32u)
1523
+ 0x501a => { Name => 'ColorTransferFunction', Binary => 1 }, # (undef)
1524
+ 0x501b => { Name => 'ThumbnailData', Binary => 1, Format => 'undef' }, # (int8u)
1525
+ 0x5020 => 'ThumbnailImageWidth', # (int16u or int32u)
1526
+ 0x5021 => 'ThumbnailImageHeight', # (int16u or int32u)
1527
+ 0x5022 => 'ThumbnailBitsPerSample', # (int16u[N])
1528
+ 0x5023 => 'ThumbnailCompression', # (int16u)
1529
+ 0x5024 => 'ThumbnailPhotometricInterp', # (int16u)
1530
+ 0x5025 => 'ThumbnailDescription', # (string)
1531
+ 0x5026 => 'ThumbnailEquipMake', # (string)
1532
+ 0x5027 => 'ThumbnailEquipModel', # (string)
1533
+ 0x5028 => 'ThumbnailStripOffsets', # (int16u or int32u)
1534
+ 0x5029 => 'ThumbnailOrientation', # (int16u)
1535
+ 0x502a => 'ThumbnailSamplesPerPixel', # (int16u)
1536
+ 0x502b => 'ThumbnailRowsPerStrip', # (int16u or int32u)
1537
+ 0x502c => 'ThumbnailStripByteCounts', # (int16u or int32u)
1538
+ 0x502d => 'ThumbnailResolutionX',
1539
+ 0x502e => 'ThumbnailResolutionY',
1540
+ 0x502f => 'ThumbnailPlanarConfig', # (int16u)
1541
+ 0x5030 => 'ThumbnailResolutionUnit', # (int16u)
1542
+ 0x5031 => 'ThumbnailTransferFunction', # (int16u[N])
1543
+ 0x5032 => 'ThumbnailSoftware', # (string)
1544
+ 0x5033 => { Name => 'ThumbnailDateTime', Groups => { 2 => 'Time' } }, # (string)
1545
+ 0x5034 => 'ThumbnailArtist', # (string)
1546
+ 0x5035 => 'ThumbnailWhitePoint', # (rational64u[2])
1547
+ 0x5036 => 'ThumbnailPrimaryChromaticities', # (rational64u[6])
1548
+ 0x5037 => 'ThumbnailYCbCrCoefficients', # (rational64u[3])
1549
+ 0x5038 => 'ThumbnailYCbCrSubsampling', # (int16u)
1550
+ 0x5039 => 'ThumbnailYCbCrPositioning', # (int16u)
1551
+ 0x503a => 'ThumbnailRefBlackWhite', # (rational64u[6])
1552
+ 0x503b => 'ThumbnailCopyright', # (string)
1553
+ 0x5090 => 'LuminanceTable', # (int16u[64])
1554
+ 0x5091 => 'ChrominanceTable', # (int16u[64])
1555
+ 0x5100 => 'FrameDelay', # (int32u[N])
1556
+ 0x5101 => 'LoopCount', # (int16u)
1557
+ 0x5102 => 'GlobalPalette', # (int8u[N])
1558
+ 0x5103 => 'IndexBackground', # (int8u)
1559
+ 0x5104 => 'IndexTransparent', # (int8u)
1560
+ 0x5110 => 'PixelUnits', # (int8u)
1561
+ 0x5111 => 'PixelsPerUnitX', # (int32u)
1562
+ 0x5112 => 'PixelsPerUnitY', # (int32u)
1563
+ 0x5113 => 'PaletteHistogram', # (int8u[N])
1495
1564
  0x7000 => { #JR
1496
1565
  Name => 'SonyRawFileType',
1497
1566
  # (only valid if Sony:FileFormat >= ARW 2.0, ref IB)
@@ -3102,7 +3171,7 @@ my %opcodeInfo = (
3102
3171
  # by returning undef from the WriteProc), but we can't rebuild this directory
3103
3172
  # by writing it properly because there is an erroneous StripByteCounts value
3104
3173
  # written by the X2D 100C that renders the data unreadable
3105
- WriteProc => sub { return undef },
3174
+ WriteProc => sub { return undef },
3106
3175
  },
3107
3176
  },
3108
3177
  0xc573 => { #PH
@@ -4251,6 +4320,16 @@ my %opcodeInfo = (
4251
4320
  Protected => 1,
4252
4321
  Binary => 1,
4253
4322
  },
4323
+ 0xcd41 => {
4324
+ Name => 'JUMBF',
4325
+ # (set Deletable flag so we can delete this because
4326
+ # Jpeg2000 directories are otherwise permanent)
4327
+ Deletable => 1,
4328
+ SubDirectory => {
4329
+ TagTable => 'Image::ExifTool::Jpeg2000::Main',
4330
+ ByteOrder => 'BigEndian',
4331
+ },
4332
+ },
4254
4333
  0xcd43 => { # DNG 1.7
4255
4334
  Name => 'ColumnInterleaveFactor',
4256
4335
  Writable => 'int32u',