exiftool-vendored.pl 12.85.0 → 12.91.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 (49) hide show
  1. package/bin/Changes +87 -0
  2. package/bin/MANIFEST +1 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +16 -16
  5. package/bin/README +3 -2
  6. package/bin/build_geolocation +7 -4
  7. package/bin/build_tag_lookup +29 -11
  8. package/bin/config_files/example.config +5 -0
  9. package/bin/config_files/onone.config +28 -0
  10. package/bin/exiftool +23 -15
  11. package/bin/lib/Image/ExifTool/AIFF.pm +8 -4
  12. package/bin/lib/Image/ExifTool/ASF.pm +4 -1
  13. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +14 -8
  14. package/bin/lib/Image/ExifTool/Canon.pm +102 -12
  15. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  16. package/bin/lib/Image/ExifTool/CanonVRD.pm +5 -2
  17. package/bin/lib/Image/ExifTool/FujiFilm.pm +46 -4
  18. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  19. package/bin/lib/Image/ExifTool/Geolocation.pm +6 -0
  20. package/bin/lib/Image/ExifTool/ID3.pm +39 -33
  21. package/bin/lib/Image/ExifTool/InDesign.pm +8 -4
  22. package/bin/lib/Image/ExifTool/Jpeg2000.pm +0 -1
  23. package/bin/lib/Image/ExifTool/Lang/de.pm +2 -2
  24. package/bin/lib/Image/ExifTool/Matroska.pm +66 -10
  25. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  26. package/bin/lib/Image/ExifTool/Nikon.pm +36 -2
  27. package/bin/lib/Image/ExifTool/Olympus.pm +27 -17
  28. package/bin/lib/Image/ExifTool/PNG.pm +10 -2
  29. package/bin/lib/Image/ExifTool/Panasonic.pm +1 -0
  30. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
  31. package/bin/lib/Image/ExifTool/Pentax.pm +80 -14
  32. package/bin/lib/Image/ExifTool/QuickTime.pm +58 -13
  33. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +111 -8
  34. package/bin/lib/Image/ExifTool/RIFF.pm +20 -10
  35. package/bin/lib/Image/ExifTool/Samsung.pm +56 -19
  36. package/bin/lib/Image/ExifTool/Sony.pm +21 -11
  37. package/bin/lib/Image/ExifTool/TagLookup.pm +6808 -6788
  38. package/bin/lib/Image/ExifTool/TagNames.pod +120 -55
  39. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  40. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +84 -15
  41. package/bin/lib/Image/ExifTool/Writer.pl +7 -4
  42. package/bin/lib/Image/ExifTool/XMP.pm +8 -8
  43. package/bin/lib/Image/ExifTool/XMP2.pl +51 -30
  44. package/bin/lib/Image/ExifTool/ZIP.pm +8 -4
  45. package/bin/lib/Image/ExifTool.pm +65 -42
  46. package/bin/lib/Image/ExifTool.pod +28 -20
  47. package/bin/perl-Image-ExifTool.spec +1 -1
  48. package/bin/pp_build_exe.args +4 -4
  49. package/package.json +3 -3
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.75';
91
+ $VERSION = '4.79';
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)
@@ -630,6 +630,7 @@ $VERSION = '4.75';
630
630
  '61182.53' => 'Canon RF 28mm F2.8 STM', #42
631
631
  '61182.54' => 'Canon RF 24-105mm F2.8 L IS USM Z', #42
632
632
  '61182.55' => 'Canon RF-S 10-18mm F4.5-6.3 IS STM', #42
633
+ '61182.56' => 'Canon RF 35mm F1.4 L VCM', #42
633
634
  65535 => 'n/a',
634
635
  );
635
636
 
@@ -2128,6 +2129,13 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2128
2129
  TagTable => 'Image::ExifTool::Canon::RawBurstInfo',
2129
2130
  }
2130
2131
  },
2132
+ 0x4059 => { #forum16111
2133
+ Name => 'LevelInfo',
2134
+ SubDirectory => {
2135
+ Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
2136
+ TagTable => 'Image::ExifTool::Canon::LevelInfo',
2137
+ }
2138
+ },
2131
2139
  );
2132
2140
 
2133
2141
  #..............................................................................
@@ -2590,6 +2598,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2590
2598
  },
2591
2599
  # 47 - related to aspect ratio: 100=4:3,70=1:1/16:9,90=3:2,60=4:5 (PH G12)
2592
2600
  # (roughly image area in percent - 4:3=100%,1:1/16:9=75%,3:2=89%,4:5=60%)
2601
+ # 48 - 3 for CR2/CR3, 4 or 7 for JPG, -1 for edited JPG (see forum16127)
2593
2602
  51 => { #forum16036 (EOS R models)
2594
2603
  Name => 'Clarity',
2595
2604
  PrintConv => {
@@ -4722,12 +4731,15 @@ my %ciMaxFocal = (
4722
4731
  FIRST_ENTRY => 0,
4723
4732
  PRIORITY => 0,
4724
4733
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4725
- NOTES => 'CameraInfo tags for the EOS R6.',
4734
+ NOTES => 'CameraInfo tags for the EOS R5 and R6.',
4735
+ # (see forum16111 for more notes on these tags)
4736
+ # 0x0a5d - some sort of sequence number starting from 1 (ref forum16111)
4726
4737
  0x0af1 => { #forum15210/15579
4727
4738
  Name => 'ShutterCount',
4728
4739
  Format => 'int32u',
4729
4740
  Notes => 'includes electronic + mechanical shutter',
4730
4741
  },
4742
+ # 0x0bb7 - counts down during focus stack (ref forum16111)
4731
4743
  );
4732
4744
 
4733
4745
  # ref https://exiftool.org/forum/index.php?topic=15356.0
@@ -6389,8 +6401,14 @@ my %ciMaxFocal = (
6389
6401
  10 => 'AF Point Expansion (8 point)', #forum6237
6390
6402
  11 => 'Flexizone Multi (49 point)', #PH (NC, EOS M, live view; 750D 49 points)
6391
6403
  12 => 'Flexizone Multi (9 point)', #PH (750D, 9 points)
6392
- 13 => 'Flexizone Single', #PH (EOS M default, live view)
6404
+ 13 => 'Flexizone Single', #PH (EOS M default, live view) (R7 calls this '1-point AF', ref github268)
6393
6405
  14 => 'Large Zone AF', #PH/forum6237 (7DmkII)
6406
+ 16 => 'Large Zone AF (vertical)', #forum16223
6407
+ 17 => 'Large Zone AF (horizontal)', #forum16223
6408
+ 19 => 'Flexible Zone AF 1', #github268 (R7)
6409
+ 20 => 'Flexible Zone AF 2', #github268 (R7)
6410
+ 21 => 'Flexible Zone AF 3', #github268 (R7)
6411
+ 22 => 'Whole Area AF', #github268 (R7)
6394
6412
  },
6395
6413
  },
6396
6414
  2 => {
@@ -6905,6 +6923,10 @@ my %ciMaxFocal = (
6905
6923
  Name => 'FlashExposureLock',
6906
6924
  PrintConv => \%offOn,
6907
6925
  },
6926
+ 32 => { #forum16257
6927
+ Name => 'AntiFlicker',
6928
+ PrintConv => \%offOn,
6929
+ },
6908
6930
  0x3d => { #IB
6909
6931
  Name => 'RFLensType',
6910
6932
  Format => 'int16u',
@@ -6969,6 +6991,7 @@ my %ciMaxFocal = (
6969
6991
  313 => 'Canon RF 28mm F2.8 STM', #42
6970
6992
  314 => 'Canon RF 24-105mm F2.8 L IS USM Z', #42
6971
6993
  315 => 'Canon RF-S 10-18mm F4.5-6.3 IS STM', #42
6994
+ 316 => 'Canon RF 35mm F1.4 L VCM', #42
6972
6995
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6973
6996
  },
6974
6997
  },
@@ -8768,7 +8791,7 @@ my %ciMaxFocal = (
8768
8791
  Name => 'DigitalLensOptimizer',
8769
8792
  PrintConv => {
8770
8793
  0 => 'Off',
8771
- 1 => 'Stanard',
8794
+ 1 => 'Standard',
8772
8795
  2 => 'High',
8773
8796
  },
8774
8797
  },
@@ -9001,20 +9024,32 @@ my %filterConv = (
9001
9024
  4 => 'Focus High Priority',
9002
9025
  },
9003
9026
  },
9004
- 7 => { #52
9027
+ 7 => [{ #forum16068
9005
9028
  Name => 'USMLensElectronicMF',
9029
+ Condition => '$$self{Model} =~ /EOS R\d/',
9030
+ Notes => 'EOS R models',
9031
+ PrintConv => {
9032
+ 0 => 'Disable After One-Shot',
9033
+ 1 => 'One-Shot -> Enabled',
9034
+ 2 => 'One-Shot -> Enabled (magnify)',
9035
+ 3 => 'Disable in AF Mode',
9036
+ },
9037
+ },{ #52
9038
+ Name => 'USMLensElectronicMF',
9039
+ Notes => 'Other models',
9006
9040
  PrintConv => {
9007
9041
  0 => 'Enable After AF',
9008
9042
  1 => 'Disable After AF',
9009
9043
  2 => 'Disable in AF Mode',
9010
9044
  },
9011
- },
9045
+ }],
9012
9046
  8 => { #52
9013
9047
  Name => 'AFAssistBeam',
9014
9048
  PrintConv => {
9015
9049
  0 => 'Enable',
9016
9050
  1 => 'Disable',
9017
9051
  2 => 'IR AF Assist Beam Only',
9052
+ 3 => 'LED AF Assist Beam Only', #forum16068
9018
9053
  },
9019
9054
  },
9020
9055
  9 => { #52
@@ -9094,25 +9129,38 @@ my %filterConv = (
9094
9129
  2 => 'Disable',
9095
9130
  },
9096
9131
  },
9097
- 18 => { #52
9132
+ 18 => { #52/forum16223
9098
9133
  Name => 'AFStatusViewfinder',
9099
- Condition => '$$self{Model} =~ /1D X/',
9100
- Notes => '1D X only',
9134
+ Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
9135
+ Notes => '1D X and R models',
9101
9136
  PrintConv => {
9102
9137
  0 => 'Show in Field of View',
9103
9138
  1 => 'Show Outside View',
9104
9139
  },
9105
9140
  },
9106
- 19 => { #52
9141
+ 19 => { #52/forum16223
9107
9142
  Name => 'InitialAFPointInServo',
9108
- Condition => '$$self{Model} =~ /1D X/',
9109
- Notes => '1D X only',
9143
+ Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
9144
+ Notes => '1D X and R models',
9110
9145
  PrintConv => {
9111
9146
  0 => 'Initial AF Point Selected',
9112
9147
  1 => 'Manual AF Point',
9113
9148
  2 => 'Auto', #PH (1DXmkII)
9114
9149
  },
9115
9150
  },
9151
+ 20 => { #forum16068
9152
+ Name => 'SubjectToDetect',
9153
+ PrintConv => {
9154
+ 0 => 'None',
9155
+ 1 => 'People',
9156
+ 2 => 'Animals',
9157
+ 3 => 'Vehicles',
9158
+ },
9159
+ },
9160
+ 24 => { #forum16068
9161
+ Name => 'EyeDetection',
9162
+ PrintConv => \%offOn,
9163
+ },
9116
9164
  );
9117
9165
 
9118
9166
  # RAW burst mode info (MakerNotes tag 0x403f) (ref 25)
@@ -9125,6 +9173,48 @@ my %filterConv = (
9125
9173
  2 => 'RawBurstImageCount',
9126
9174
  );
9127
9175
 
9176
+ # level information (ref forum16111, EOS R5)
9177
+ %Image::ExifTool::Canon::LevelInfo = (
9178
+ %binaryDataAttrs,
9179
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9180
+ FORMAT => 'int32s',
9181
+ FIRST_ENTRY => 1,
9182
+ 4 => {
9183
+ Name => 'RollAngle',
9184
+ Notes => 'converted to degrees of clockwise camera rotation',
9185
+ ValueConv => '$val > 1800 and $val -= 3600; -$val / 10',
9186
+ ValueConvInv => '$val > 0 and $val -= 360; int(-$val * 10 + 0.5)',
9187
+ },
9188
+ 5 => {
9189
+ Name => 'PitchAngle',
9190
+ Notes => 'converted to degrees of upward camera tilt',
9191
+ ValueConv => '$val > 1800 and $val -= 3600; $val / 10',
9192
+ ValueConvInv => '$val < 0 and $val += 360; int($val * 10 + 0.5)',
9193
+ },
9194
+ 7 => {
9195
+ Name => 'FocalLength',
9196
+ ValueConv => '$val / 10',
9197
+ ValueConvInv => 'int($val * 10 + 0.5)',
9198
+ PrintConv => '"$val mm"',
9199
+ PrintConvInv => '$val=~s/\s*mm//;$val',
9200
+ },
9201
+ 8 => {
9202
+ Name => 'MinFocalLength',
9203
+ ValueConv => '$val / 10',
9204
+ ValueConvInv => 'int($val * 10 + 0.5)',
9205
+ PrintConv => '"$val mm"',
9206
+ PrintConvInv => '$val=~s/\s*mm//;$val',
9207
+ },
9208
+ 9 => {
9209
+ Name => 'MaxFocalLength',
9210
+ ValueConv => '$val / 10',
9211
+ ValueConvInv => 'int($val * 10 + 0.5)',
9212
+ PrintConv => '"$val mm"',
9213
+ PrintConvInv => '$val=~s/\s*mm//;$val',
9214
+ },
9215
+
9216
+ );
9217
+
9128
9218
  # Canon UUID atoms (ref PH, SX280)
9129
9219
  %Image::ExifTool::Canon::uuid = (
9130
9220
  GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' },
@@ -562,7 +562,7 @@ sub BuildMakerNotes($$$$$$);
562
562
  3 => {
563
563
  Name => 'Rotation',
564
564
  Format => 'int32s',
565
- Writable => 'int32s',
565
+ Writable => 1,
566
566
  },
567
567
  4 => 'ComponentBitDepth', #3
568
568
  5 => 'ColorBitDepth', #3
@@ -1212,9 +1212,9 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
1212
1212
  4 => 'Emphasize Center',
1213
1213
  },
1214
1214
  },
1215
+ 0x2070b => { Name => 'DiffractionCorrectionOn', %noYes },
1215
1216
  # 0x20800 - fmt=1: 0
1216
1217
  # 0x20801 - fmt=1: 0
1217
- 0x2070b => { Name => 'DiffractionCorrectionOn', %noYes },
1218
1218
  0x20900 => 'ColorHue',
1219
1219
  0x20901 => 'SaturationAdj',
1220
1220
  0x20910 => 'RedHSL',
@@ -1282,6 +1282,9 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
1282
1282
  # 0xf0521 - DLO data
1283
1283
  # 0xf0520 - DLO data
1284
1284
  # 0xf0530 - created when dust delete data applied (4 bytes, all zero)
1285
+ # 0xf0561 - 1932 bytes, related to Partial Adjustment Tool Palette (ref forum15660)
1286
+ # 0xf0562 - 1596 bytes, related to Partial Adjustment Tool Palette (ref forum15660)
1287
+ # 0xf0566 - 1520 bytes, related to Partial Adjustment Tool Palette (ref forum15660)
1285
1288
  # 0xf0600 - fmt=253 (2308 bytes, JPG images)
1286
1289
  # 0xf0601 - fmt=253 (2308 bytes, JPG images)
1287
1290
  # 0x1ff52c - values: 129,130,132 (related to custom picture style somehow)
@@ -1303,7 +1306,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
1303
1306
  # 2 - value: 6
1304
1307
  3 => {
1305
1308
  Name => 'DR4CameraModel',
1306
- Writable => 'int32u',
1309
+ Format => 'int32u',
1307
1310
  PrintHex => 1,
1308
1311
  SeparateTable => 'Canon CanonModelID',
1309
1312
  PrintConv => \%Image::ExifTool::Canon::canonModelID,
@@ -31,7 +31,7 @@ use vars qw($VERSION);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
  use Image::ExifTool::Exif;
33
33
 
34
- $VERSION = '1.94';
34
+ $VERSION = '1.95';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -1169,6 +1169,46 @@ my %faceCategories = (
1169
1169
  Face8Birthday => { },
1170
1170
  );
1171
1171
 
1172
+ # tags extracted from RAF header
1173
+ %Image::ExifTool::FujiFilm::RAFHeader = (
1174
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1175
+ GROUPS => { 0 => 'RAF', 1 => 'RAF', 2 => 'Image' },
1176
+ NOTES => 'Tags extracted from the header of RAF images.',
1177
+ # 0x00 - eg. "FUJIFILMCCD-RAW 0201FA392001FinePix S3Pro"
1178
+ 0x3c => { #PH
1179
+ Name => 'RAFVersion',
1180
+ Format => 'undef[4]',
1181
+ },
1182
+ # (all int32u values)
1183
+ # 0x40 - 1 for M-RAW, 0 otherwise?
1184
+ # 0x44 - high word of M-RAW offset? (only seen zero)
1185
+ # 0x48 - M-RAW header offset
1186
+ # 0x4c - M-RAW header length
1187
+ # 0x50 - ? (only seen zero)
1188
+ # 0x54 - JPEG offset
1189
+ # 0x58 - JPEG length
1190
+ # 0x5c - RAF directory offset
1191
+ # 0x60 - RAF directory length
1192
+ # 0x64 - FujiIFD dir offset
1193
+ # 0x68 - FujiIFD dir length
1194
+ # 0x6c - RAFCompression or JPEG start
1195
+ 0x6c => { #10
1196
+ Name => 'RAFCompression',
1197
+ Condition => '$$valPt =~ /^\0\0\0/', # (JPEG header is in this location for some RAF versions)
1198
+ Format => 'int32u',
1199
+ PrintConv => { 0 => 'Uncompressed', 2 => 'Lossless', 3 => 'Lossy' },
1200
+ },
1201
+ # 0x70 - ? same as 0x68?
1202
+ # 0x74 - ? usually 0, but have seen 0x1700
1203
+ # 0x78 - RAF1 dir offset
1204
+ # 0x7c - RAF1 dir length
1205
+ # 0x80 - FujiIFD1 dir offset
1206
+ # 0x84 - FujiIFD1 dir length
1207
+ # 0x88-0x8c - always zero?
1208
+ # 0x90 - ? same as 0x74?
1209
+ # 0x94 - JPEG or M-RAW start
1210
+ );
1211
+
1172
1212
  # tags in RAF images (ref 5)
1173
1213
  %Image::ExifTool::FujiFilm::RAF = (
1174
1214
  PROCESS_PROC => \&ProcessFujiDir,
@@ -1797,7 +1837,7 @@ sub ProcessRAF($$)
1797
1837
  my ($buff, $jpeg, $warn, $offset);
1798
1838
 
1799
1839
  my $raf = $$dirInfo{RAF};
1800
- $raf->Read($buff,0x5c) == 0x5c or return 0;
1840
+ $raf->Read($buff,0x70) == 0x70 or return 0;
1801
1841
  $buff =~ /^FUJIFILM/ or return 0;
1802
1842
  # get position and size of M-RAW header and jpeg preview
1803
1843
  my ($mpos, $mlen) = unpack('x72NN', $buff);
@@ -1807,9 +1847,11 @@ sub ProcessRAF($$)
1807
1847
  $raf->Seek($jpos, 0) or return 0;
1808
1848
  $raf->Read($jpeg, $jlen) == $jlen or return 0;
1809
1849
  }
1850
+ SetByteOrder('MM');
1810
1851
  $et->SetFileType();
1811
- $et->FoundTag('RAFVersion', substr($buff, 0x3c, 4));
1812
-
1852
+ my $tbl = GetTagTable('Image::ExifTool::FujiFilm::RAFHeader');
1853
+ $et->ProcessDirectory({ DataPt => \$buff, DirName => 'RAFHeader' }, $tbl);
1854
+
1813
1855
  # extract information from embedded JPEG
1814
1856
  my %dirInfo = (
1815
1857
  Parent => 'RAF',
@@ -509,6 +509,12 @@ sub Geolocate($;$)
509
509
  $city = '' unless defined $city;
510
510
  } elsif (/^[-+]?\d+(\.\d+)?$/) { # coordinate format
511
511
  push @coords, $_ if @coords < 2;
512
+ } elsif (/^([-+]?\d+(?:\.\d+)?) *(([NS])[A-Z]*)? +([-+]?\d+(?:\.\d+)?) *(([EW])[A-Z]*)?/i) { # "lat lon" format
513
+ next if @coords;
514
+ my ($lat, $lon) = ($1, $4);
515
+ $lat = -abs($lat) if $3 and uc($3) eq 'S';
516
+ $lon = -abs($lon) if $6 and uc($6) eq 'W';
517
+ push @coords, $lat, $lon;
512
518
  } elsif (lc $_ eq 'both') {
513
519
  $both = 1;
514
520
  } elsif ($_ =~ /^num=(\d+)$/i) {
@@ -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.61';
21
+ $VERSION = '1.62';
22
22
 
23
23
  sub ProcessID3v2($$$);
24
24
  sub ProcessPrivate($$$);
@@ -68,6 +68,12 @@ my %dateTimeConv = (
68
68
  PrintConv => '$self->ConvertDateTime($val)',
69
69
  );
70
70
 
71
+ # patch for names of user-defined tags which don't automatically generate very well
72
+ my %userTagName = (
73
+ ALBUMARTISTSORT => 'AlbumArtistSort',
74
+ ASIN => 'ASIN',
75
+ );
76
+
71
77
  # This table is just for documentation purposes
72
78
  %Image::ExifTool::ID3::Main = (
73
79
  VARS => { NO_ID => 1 },
@@ -103,14 +109,6 @@ my %dateTimeConv = (
103
109
  },
104
110
  );
105
111
 
106
- %Image::ExifTool::ID3::UserDefined = (
107
- GROUPS => { 1 => 'UserDefined', 2 => 'Other' },
108
- NOTES => q{
109
- ID3 user-defined text and URL tags will be dynamically added to this table
110
- by name when found.
111
- },
112
- );
113
-
114
112
  # Lyrics3 tags (ref 4)
115
113
  %Image::ExifTool::ID3::Lyrics3 = (
116
114
  GROUPS => { 1 => 'Lyrics3', 2 => 'Audio' },
@@ -501,7 +499,7 @@ my %genre = (
501
499
  TT2 => 'Title',
502
500
  TT3 => 'Subtitle',
503
501
  TXT => 'Lyricist',
504
- TXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
502
+ TXX => 'UserDefinedText',
505
503
  TYE => { Name => 'Year', Groups => { 2 => 'Time' } },
506
504
  ULT => 'Lyrics',
507
505
  WAF => 'FileURL',
@@ -510,7 +508,7 @@ my %genre = (
510
508
  WCM => 'CommercialURL',
511
509
  WCP => { Name => 'CopyrightURL', Groups => { 2 => 'Author' } },
512
510
  WPB => 'PublisherURL',
513
- WXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
511
+ WXX => 'UserDefinedURL',
514
512
  # the following written by iTunes 10.5 (ref PH)
515
513
  RVA => 'RelativeVolumeAdjustment',
516
514
  TST => 'TitleSortOrder',
@@ -613,7 +611,7 @@ my %id3v2_common = (
613
611
  TRSO => 'InternetRadioStationOwner',
614
612
  TSRC => 'ISRC', # (international standard recording code)
615
613
  TSSE => 'EncoderSettings',
616
- TXXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
614
+ TXXX => 'UserDefinedText',
617
615
  # UFID => 'UniqueFileID', (not extracted because it is long and nasty and not very useful)
618
616
  USER => 'TermsOfUse',
619
617
  USLT => 'Lyrics',
@@ -625,7 +623,7 @@ my %id3v2_common = (
625
623
  WORS => 'InternetRadioStationURL',
626
624
  WPAY => 'PaymentURL',
627
625
  WPUB => 'PublisherURL',
628
- WXXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
626
+ WXXX => 'UserDefinedURL',
629
627
  #
630
628
  # non-standard frames
631
629
  #
@@ -879,6 +877,19 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::ID3');
879
877
  }
880
878
  }
881
879
 
880
+ #------------------------------------------------------------------------------
881
+ # Make tag name for user-defined tag
882
+ # Inputs: 0) User defined tag description
883
+ # Returns: Tag name
884
+ sub MakeTagName($)
885
+ {
886
+ my $name = shift;
887
+ return $userTagName{$name} if $userTagName{$name};
888
+ $name = ucfirst(lc $name) unless $name =~ /[a-z]/; # convert all uppercase to mixed case
889
+ $name =~ s/([a-z])[_ ]([a-z])/$1\U$2/g;
890
+ return Image::ExifTool::MakeTagName($name);
891
+ }
892
+
882
893
  #------------------------------------------------------------------------------
883
894
  # Convert ID3v1 text to exiftool character set
884
895
  # Inputs: 0) ExifTool object ref, 1) text string
@@ -1255,39 +1266,34 @@ sub ProcessID3v2($$$)
1255
1266
  # two encoded strings separated by a null
1256
1267
  my @vals = DecodeString($et, $val);
1257
1268
  foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
1258
- $vals[0] .= ' ' if $Image::ExifTool::specialTags{$vals[0]};
1259
- my $tbl = GetTagTable('Image::ExifTool::ID3::UserDefined');
1260
- unless (defined $$tbl{$vals[0]}) {
1261
- my $name = Image::ExifTool::MakeTagName($vals[0]);
1262
- AddTagToTable($tbl, $vals[0], $name, 1);
1269
+ if (length $vals[0]) {
1270
+ $id .= "_$vals[0]";
1271
+ $tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($vals[0]));
1263
1272
  }
1264
- $et->HandleTag($tbl, $vals[0], $vals[1]);
1265
- next;
1273
+ $val = $vals[1];
1266
1274
  } elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS|GP1|MVI|MVN)$/) {
1267
1275
  $val = DecodeString($et, $val);
1268
1276
  } elsif ($id =~ /^(WXX|WXXX)$/) {
1269
1277
  # one encoded string and one Latin string separated by a null
1270
1278
  my $enc = unpack('C', $val);
1271
- my $url;
1279
+ my ($tag, $url);
1272
1280
  if ($enc == 1 or $enc == 2) {
1273
- ($val, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/s);
1281
+ ($tag, $url) = ($tag =~ /^(.(?:..)*?)\0\0(.*)/s);
1274
1282
  } else {
1275
- ($val, $url) = ($val =~ /^(..*?)\0(.*)/s);
1283
+ ($tag, $url) = ($tag =~ /^(..*?)\0(.*)/s);
1276
1284
  }
1277
- unless (defined $val and defined $url) {
1285
+ unless (defined $tag and defined $url) {
1278
1286
  $et->Warn("Invalid $id frame value");
1279
1287
  next;
1280
1288
  }
1281
- $val = DecodeString($et, $val);
1282
- $url =~ s/\0.*//s;
1283
- $val .= '_URL';
1284
- my $tbl = GetTagTable('Image::ExifTool::ID3::UserDefined');
1285
- unless (defined $$tbl{$val}) {
1286
- my $name = Image::ExifTool::MakeTagName($val);
1287
- AddTagToTable($tbl, $val, $name, 1);
1289
+ $tag = DecodeString($et, $tag);
1290
+ if (length $tag) {
1291
+ $id .= "_$tag";
1292
+ $tag .= '_URL' unless $tag =~ /url/i;
1293
+ $tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($tag));
1288
1294
  }
1289
- $et->HandleTag($tbl, $val, $url);
1290
- next;
1295
+ $url =~ s/\0.*//s;
1296
+ $val = $url;
1291
1297
  } elsif ($id =~ /^W/) {
1292
1298
  $val =~ s/\0.*//s; # truncate at null
1293
1299
  } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.06';
17
+ $VERSION = '1.07';
18
18
 
19
19
  # map for writing metadata to InDesign files (currently only write XMP)
20
20
  my %indMap = (
@@ -73,9 +73,13 @@ sub ProcessIND($$)
73
73
  my $pages = Get32u($curPage, 280);
74
74
  $pages < 2 and $err = 'Invalid page count', goto DONE;
75
75
  my $pos = $pages * 4096;
76
- if ($pos > 0x7fffffff and not $et->Options('LargeFileSupport')) {
77
- $err = 'InDesign files larger than 2 GB not supported (LargeFileSupport not set)';
78
- goto DONE;
76
+ if ($pos > 0x7fffffff) {
77
+ if (not $et->Options('LargeFileSupport')) {
78
+ $err = 'InDesign files larger than 2 GB not supported (LargeFileSupport not set)';
79
+ goto DONE;
80
+ } elsif ($et->Options('LargeFileSupport') eq '2') {
81
+ $et->WarnOnce('Processing large file (LargeFileSupport is 2)');
82
+ }
79
83
  }
80
84
  if ($outfile) {
81
85
  # make XMP the preferred group for writing
@@ -727,7 +727,6 @@ my %j2cMarker = (
727
727
  {
728
728
  Name => 'ColorSpecData',
729
729
  Format => 'undef[$size-3]',
730
- Writable => 'undef',
731
730
  Protected => 1,
732
731
  Binary => 1,
733
732
  },
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::de;
11
11
  use strict;
12
12
  use vars qw($VERSION);
13
13
 
14
- $VERSION = '1.36';
14
+ $VERSION = '1.37';
15
15
 
16
16
  %Image::ExifTool::Lang::de::Translate = (
17
17
  'AEAperture' => 'AE-Blende',
@@ -5118,7 +5118,7 @@ $VERSION = '1.36';
5118
5118
  'LensMake' => 'Objektivhersteller',
5119
5119
  'LensManufacturer' => 'Objektivhersteller',
5120
5120
  'LensMaxApertureRange' => 'Objektiv Blendenbereich',
5121
- 'LensModel' => 'Objektiv-Typ',
5121
+ 'LensModel' => 'Objektivmodell',
5122
5122
  'LensProfileDigest' => 'Kennwert des Objektivprofils',
5123
5123
  'LensProperties' => 'Objektivfunktionen?',
5124
5124
  'LensSerialNumber' => 'Objektiv-Seriennummer',