exiftool-vendored.exe 12.69.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 (43) hide show
  1. package/bin/exiftool_files/Changes +78 -12
  2. package/bin/exiftool_files/README +10 -10
  3. package/bin/exiftool_files/exiftool.pl +32 -27
  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/CBOR.pm +18 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +82 -20
  8. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +3 -2
  9. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +54 -6
  10. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +111 -11
  11. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +145 -20
  12. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +5 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +76 -10
  15. package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +1 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +4 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  19. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +21 -16
  20. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +2 -2
  21. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +203 -102
  22. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +7 -1
  23. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +8 -13
  24. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +10 -1
  25. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +15 -6
  26. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +59 -13
  27. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +59 -11
  28. package/bin/exiftool_files/lib/Image/ExifTool/README +7 -2
  29. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +53 -9
  30. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +109 -1
  31. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +3 -2
  32. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +177 -37
  33. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6961 -6856
  34. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +580 -344
  35. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +4 -5
  36. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +6 -5
  37. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +19 -4
  38. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
  39. package/bin/exiftool_files/lib/Image/ExifTool/WriteRIFF.pl +9 -3
  40. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +102 -50
  41. package/bin/exiftool_files/lib/Image/ExifTool.pm +74 -36
  42. package/bin/exiftool_files/lib/Image/ExifTool.pod +28 -17
  43. package/package.json +5 -4
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.70';
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)
@@ -611,22 +611,24 @@ $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
628
- # we need the RFLensType values for the following...
629
- '61182.52' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
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
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
630
632
  65535 => 'n/a',
631
633
  );
632
634
 
@@ -1395,6 +1397,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1395
1397
  Condition => '$$self{Model} =~ /\bEOS R6$/',
1396
1398
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6' },
1397
1399
  },
1400
+ {
1401
+ Name => 'CanonCameraInfoG5XII',
1402
+ Condition => '$$self{Model} =~ /\bG5 X Mark II$/',
1403
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoG5XII' },
1404
+ },
1398
1405
  {
1399
1406
  Name => 'CanonCameraInfoPowerShot',
1400
1407
  # valid if format is int32u[138] or int32u[148]
@@ -4714,6 +4721,44 @@ my %ciMaxFocal = (
4714
4721
  },
4715
4722
  );
4716
4723
 
4724
+ # ref https://exiftool.org/forum/index.php?topic=15356.0
4725
+ %Image::ExifTool::Canon::CameraInfoG5XII = (
4726
+ %binaryDataAttrs,
4727
+ FIRST_ENTRY => 0,
4728
+ PRIORITY => 0,
4729
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4730
+ NOTES => 'CameraInfo tags for the PowerShot G5 X Mark II.',
4731
+ 0x0293 => {
4732
+ Name => 'ShutterCount',
4733
+ Format => 'int32u',
4734
+ Notes => 'includes electronic + mechanical shutter',
4735
+ # - advances by 1 for each photo file, regardless of mechanical or electronic shutter
4736
+ # - does not advance for regular video files
4737
+ # - advances for time lapse video files
4738
+ # - creating a new directory or resetting the counter from the menu doesn't affect this shutter count
4739
+ },
4740
+ 0x0b21 => {
4741
+ Name => 'DirectoryIndex',
4742
+ Groups => { 2 => 'Image' },
4743
+ Format => 'int32u',
4744
+ },
4745
+ 0x0b2d => {
4746
+ Name => 'FileIndex',
4747
+ Format => 'int32u',
4748
+ Groups => { 2 => 'Image' },
4749
+ Format => 'int32u',
4750
+ ValueConv => '$val + 1',
4751
+ ValueConvInv => '$val - 1',
4752
+ },
4753
+ #0x0b39 => {
4754
+ # Name => 'DirectoryIndex',
4755
+ # Groups => { 2 => 'Image' },
4756
+ # Format => 'int32u',
4757
+ # ValueConv => '$val - 1',
4758
+ # ValueConvInv => '$val + 1',
4759
+ #},
4760
+ );
4761
+
4717
4762
  # Canon camera information for 70D (MakerNotes tag 0x0d) (ref PH)
4718
4763
  %Image::ExifTool::Canon::CameraInfo70D = (
4719
4764
  %binaryDataAttrs,
@@ -6898,6 +6943,7 @@ my %ciMaxFocal = (
6898
6943
  298 => 'Canon RF 1200mm F8L IS USM', #42
6899
6944
  299 => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
6900
6945
  300 => 'Canon RF 1200mm F8L IS USM + RF2x', #42
6946
+ 301 => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH
6901
6947
  302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
6902
6948
  303 => 'Canon RF 135mm F1.8 L IS USM', #42
6903
6949
  304 => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
@@ -6905,7 +6951,13 @@ my %ciMaxFocal = (
6905
6951
  306 => 'Canon RF 100-300mm F2.8L IS USM', #42
6906
6952
  307 => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
6907
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
6957
+ 312 => 'Canon RF 10-20mm F4 L IS STM', #42
6908
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
6909
6961
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6910
6962
  },
6911
6963
  },
@@ -7422,7 +7474,7 @@ my %ciMaxFocal = (
7422
7474
  RawConv => '$$self{ColorDataVersion} = $val',
7423
7475
  PrintConv => {
7424
7476
  2 => '2 (1DmkIII)',
7425
- 3 => '3 (40D)',
7477
+ 3 => '3 (40D)', # (doesn't record SpecularWhiteLevel, ref github#233)
7426
7478
  4 => '4 (1DSmkIII)',
7427
7479
  5 => '5 (450D/1000D)',
7428
7480
  6 => '6 (50D/5DmkII)',
@@ -7732,10 +7784,15 @@ my %ciMaxFocal = (
7732
7784
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib2' }
7733
7785
  },
7734
7786
  0x108=> { #IB
7735
- Name => 'PerChannelBlackLevel',
7787
+ Name => 'PerChannelBlackLevel', # (or perhaps AverageBlackLevel?, ref github#232)
7736
7788
  Condition => '$$self{ColorDataVersion} == -3',
7737
7789
  Format => 'int16s[4]',
7738
7790
  },
7791
+ 0x296 => { #github#232
7792
+ Name => 'SpecularWhiteLevel',
7793
+ Condition => '$$self{ColorDataVersion} == -3',
7794
+ Format => 'int16u',
7795
+ },
7739
7796
  0x14d=> { #IB
7740
7797
  Name => 'PerChannelBlackLevel',
7741
7798
  Condition => '$$self{ColorDataVersion} == -4',
@@ -8650,7 +8707,7 @@ my %ciMaxFocal = (
8650
8707
  },
8651
8708
  );
8652
8709
 
8653
- # Auto Lighting Optimizater information (MakerNotes tag 0x4018) (ref PH)
8710
+ # Auto Lighting Optimizer information (MakerNotes tag 0x4018) (ref PH)
8654
8711
  %Image::ExifTool::Canon::LightingOpt = (
8655
8712
  %binaryDataAttrs,
8656
8713
  FORMAT => 'int32s',
@@ -8702,6 +8759,10 @@ my %ciMaxFocal = (
8702
8759
  2 => 'High',
8703
8760
  },
8704
8761
  },
8762
+ 11 => { #forum15445
8763
+ Name => 'DualPixelRaw',
8764
+ PrintConv => \%offOn,
8765
+ },
8705
8766
  );
8706
8767
 
8707
8768
  # Lens information (MakerNotes tag 0x4019) (ref 20)
@@ -9107,6 +9168,7 @@ my %filterConv = (
9107
9168
  MakerNotes => 1,
9108
9169
  SubDirectory => {
9109
9170
  TagTable => 'Image::ExifTool::Canon::Main',
9171
+ DirName => 'MakerNotes', # (necessary for mechanism that prevents these from being deleted)
9110
9172
  ProcessProc => \&ProcessCMT3,
9111
9173
  WriteProc => \&Image::ExifTool::WriteTIFF,
9112
9174
  },
@@ -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.48';
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',
@@ -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',
@@ -1492,6 +1502,75 @@ my %opcodeInfo = (
1492
1502
  WriteGroup => 'IFD0',
1493
1503
  Avoid => 1,
1494
1504
  },
1505
+ # tags 0x5XXX are obscure tags defined by Microsoft:
1506
+ # ref https://learn.microsoft.com/en-us/previous-versions/windows/embedded/ms932271(v=msdn.10)
1507
+ # ref https://learn.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-constant-property-item-descriptions
1508
+ 0x5001 => { Name => 'ResolutionXUnit', Notes => "ID's from 0x5001 to 0x5113 are obscure tags defined by Microsoft" }, # (int16u)
1509
+ 0x5002 => 'ResolutionYUnit', # (int16u)
1510
+ 0x5003 => 'ResolutionXLengthUnit', # (int16u)
1511
+ 0x5004 => 'ResolutionYLengthUnit', # (int16u)
1512
+ 0x5005 => 'PrintFlags', # (string)
1513
+ 0x5006 => 'PrintFlagsVersion', # (int16u)
1514
+ 0x5007 => 'PrintFlagsCrop', # (int8u)
1515
+ 0x5008 => 'PrintFlagsBleedWidth', # (int32u)
1516
+ 0x5009 => 'PrintFlagsBleedWidthScale', # (int16u)
1517
+ 0x500a => 'HalftoneLPI', # (rational64u)
1518
+ 0x500b => 'HalftoneLPIUnit', # (int16u, 1=inch, 2=cm)
1519
+ 0x500c => 'HalftoneDegree', # (rational64u)
1520
+ 0x500d => 'HalftoneShape', # (int16u,0=round,1=Ellipse,2=Line,3=Square,4=Cross,5=Diamond)
1521
+ 0x500e => 'HalftoneMisc', # (int32u)
1522
+ 0x500f => 'HalftoneScreen', # (int8u)
1523
+ 0x5010 => 'JPEGQuality', # (int32u[N])
1524
+ 0x5011 => { Name => 'GridSize', Binary => 1 }, # (undef)
1525
+ 0x5012 => 'ThumbnailFormat', # (int32u,1=raw RGB,2=JPEG)
1526
+ 0x5013 => 'ThumbnailWidth', # (int32u)
1527
+ 0x5014 => 'ThumbnailHeight', # (int32u)
1528
+ 0x5015 => 'ThumbnailColorDepth', # (int16u)
1529
+ 0x5016 => 'ThumbnailPlanes', # (int16u)
1530
+ 0x5017 => 'ThumbnailRawBytes', # (int32u)
1531
+ 0x5018 => 'ThumbnailLength', # (int32u)
1532
+ 0x5019 => 'ThumbnailCompressedSize', # (int32u)
1533
+ 0x501a => { Name => 'ColorTransferFunction', Binary => 1 }, # (undef)
1534
+ 0x501b => { Name => 'ThumbnailData', Binary => 1, Format => 'undef' }, # (int8u)
1535
+ 0x5020 => 'ThumbnailImageWidth', # (int16u or int32u)
1536
+ 0x5021 => 'ThumbnailImageHeight', # (int16u or int32u)
1537
+ 0x5022 => 'ThumbnailBitsPerSample', # (int16u[N])
1538
+ 0x5023 => 'ThumbnailCompression', # (int16u)
1539
+ 0x5024 => 'ThumbnailPhotometricInterp', # (int16u)
1540
+ 0x5025 => 'ThumbnailDescription', # (string)
1541
+ 0x5026 => 'ThumbnailEquipMake', # (string)
1542
+ 0x5027 => 'ThumbnailEquipModel', # (string)
1543
+ 0x5028 => 'ThumbnailStripOffsets', # (int16u or int32u)
1544
+ 0x5029 => 'ThumbnailOrientation', # (int16u)
1545
+ 0x502a => 'ThumbnailSamplesPerPixel', # (int16u)
1546
+ 0x502b => 'ThumbnailRowsPerStrip', # (int16u or int32u)
1547
+ 0x502c => 'ThumbnailStripByteCounts', # (int16u or int32u)
1548
+ 0x502d => 'ThumbnailResolutionX',
1549
+ 0x502e => 'ThumbnailResolutionY',
1550
+ 0x502f => 'ThumbnailPlanarConfig', # (int16u)
1551
+ 0x5030 => 'ThumbnailResolutionUnit', # (int16u)
1552
+ 0x5031 => 'ThumbnailTransferFunction', # (int16u[N])
1553
+ 0x5032 => 'ThumbnailSoftware', # (string)
1554
+ 0x5033 => { Name => 'ThumbnailDateTime', Groups => { 2 => 'Time' } }, # (string)
1555
+ 0x5034 => 'ThumbnailArtist', # (string)
1556
+ 0x5035 => 'ThumbnailWhitePoint', # (rational64u[2])
1557
+ 0x5036 => 'ThumbnailPrimaryChromaticities', # (rational64u[6])
1558
+ 0x5037 => 'ThumbnailYCbCrCoefficients', # (rational64u[3])
1559
+ 0x5038 => 'ThumbnailYCbCrSubsampling', # (int16u)
1560
+ 0x5039 => 'ThumbnailYCbCrPositioning', # (int16u)
1561
+ 0x503a => 'ThumbnailRefBlackWhite', # (rational64u[6])
1562
+ 0x503b => 'ThumbnailCopyright', # (string)
1563
+ 0x5090 => 'LuminanceTable', # (int16u[64])
1564
+ 0x5091 => 'ChrominanceTable', # (int16u[64])
1565
+ 0x5100 => 'FrameDelay', # (int32u[N])
1566
+ 0x5101 => 'LoopCount', # (int16u)
1567
+ 0x5102 => 'GlobalPalette', # (int8u[N])
1568
+ 0x5103 => 'IndexBackground', # (int8u)
1569
+ 0x5104 => 'IndexTransparent', # (int8u)
1570
+ 0x5110 => 'PixelUnits', # (int8u)
1571
+ 0x5111 => 'PixelsPerUnitX', # (int32u)
1572
+ 0x5112 => 'PixelsPerUnitY', # (int32u)
1573
+ 0x5113 => 'PaletteHistogram', # (int8u[N])
1495
1574
  0x7000 => { #JR
1496
1575
  Name => 'SonyRawFileType',
1497
1576
  # (only valid if Sony:FileFormat >= ARW 2.0, ref IB)
@@ -2454,8 +2533,18 @@ my %opcodeInfo = (
2454
2533
  Name => 'CameraElevationAngle',
2455
2534
  Writable => 'rational64s',
2456
2535
  },
2457
- # 0x9999 - string: camera settings (ExifIFD, Xiaomi POCO F1)
2458
- # 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)
2459
2548
  0x9c9b => {
2460
2549
  Name => 'XPTitle',
2461
2550
  Format => 'undef',
@@ -2907,6 +2996,7 @@ my %opcodeInfo = (
2907
2996
  0xa480 => { Name => 'GDALMetadata', Writable => 'string', WriteGroup => 'IFD0' }, #3
2908
2997
  0xa481 => { Name => 'GDALNoData', Writable => 'string', WriteGroup => 'IFD0' }, #3
2909
2998
  0xa500 => { Name => 'Gamma', Writable => 'rational64u' },
2999
+ # 0xa661 - string: ? (ExifIFD, Xiaomi)
2910
3000
  0xafc0 => 'ExpandSoftware', #JD (Opanda)
2911
3001
  0xafc1 => 'ExpandLens', #JD (Opanda)
2912
3002
  0xafc2 => 'ExpandFilm', #JD (Opanda)
@@ -3102,7 +3192,7 @@ my %opcodeInfo = (
3102
3192
  # by returning undef from the WriteProc), but we can't rebuild this directory
3103
3193
  # by writing it properly because there is an erroneous StripByteCounts value
3104
3194
  # written by the X2D 100C that renders the data unreadable
3105
- WriteProc => sub { return undef },
3195
+ WriteProc => sub { return undef },
3106
3196
  },
3107
3197
  },
3108
3198
  0xc573 => { #PH
@@ -4251,6 +4341,16 @@ my %opcodeInfo = (
4251
4341
  Protected => 1,
4252
4342
  Binary => 1,
4253
4343
  },
4344
+ 0xcd41 => {
4345
+ Name => 'JUMBF',
4346
+ # (set Deletable flag so we can delete this because
4347
+ # Jpeg2000 directories are otherwise permanent)
4348
+ Deletable => 1,
4349
+ SubDirectory => {
4350
+ TagTable => 'Image::ExifTool::Jpeg2000::Main',
4351
+ ByteOrder => 'BigEndian',
4352
+ },
4353
+ },
4254
4354
  0xcd43 => { # DNG 1.7
4255
4355
  Name => 'ColumnInterleaveFactor',
4256
4356
  Writable => 'int32u',