exiftool_vendored 12.33.0 → 12.37.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +66 -0
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/exiftool +65 -37
  7. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +11 -2
  8. data/bin/lib/Image/ExifTool/Canon.pm +156 -10
  9. data/bin/lib/Image/ExifTool/Charset.pm +2 -0
  10. data/bin/lib/Image/ExifTool/DarwinCore.pm +2 -2
  11. data/bin/lib/Image/ExifTool/Exif.pm +13 -1
  12. data/bin/lib/Image/ExifTool/FLIR.pm +33 -8
  13. data/bin/lib/Image/ExifTool/GIF.pm +5 -1
  14. data/bin/lib/Image/ExifTool/GPS.pm +14 -10
  15. data/bin/lib/Image/ExifTool/ICC_Profile.pm +96 -4
  16. data/bin/lib/Image/ExifTool/Jpeg2000.pm +108 -11
  17. data/bin/lib/Image/ExifTool/Nikon.pm +992 -18
  18. data/bin/lib/Image/ExifTool/NikonCustom.pm +5 -1
  19. data/bin/lib/Image/ExifTool/NikonSettings.pm +135 -71
  20. data/bin/lib/Image/ExifTool/PDF.pm +5 -3
  21. data/bin/lib/Image/ExifTool/PNG.pm +1 -0
  22. data/bin/lib/Image/ExifTool/QuickTime.pm +17 -3
  23. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +26 -1
  24. data/bin/lib/Image/ExifTool/README +4 -0
  25. data/bin/lib/Image/ExifTool/Sony.pm +29 -11
  26. data/bin/lib/Image/ExifTool/TagInfoXML.pm +9 -4
  27. data/bin/lib/Image/ExifTool/TagLookup.pm +6437 -5843
  28. data/bin/lib/Image/ExifTool/TagNames.pod +1292 -46
  29. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +10 -0
  30. data/bin/lib/Image/ExifTool/WriteXMP.pl +10 -11
  31. data/bin/lib/Image/ExifTool/Writer.pl +50 -5
  32. data/bin/lib/Image/ExifTool/XMP.pm +119 -30
  33. data/bin/lib/Image/ExifTool/XMP2.pl +3 -2
  34. data/bin/lib/Image/ExifTool.pm +71 -8
  35. data/bin/lib/Image/ExifTool.pod +9 -1
  36. data/bin/perl-Image-ExifTool.spec +1 -1
  37. data/lib/exiftool_vendored/version.rb +1 -1
  38. metadata +2 -2
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.52';
91
+ $VERSION = '4.55';
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)
@@ -595,7 +595,10 @@ $VERSION = '4.52';
595
595
  '61182.21' => 'Canon RF 70-200mm F4L IS USM', #42
596
596
  '61182.22' => 'Canon RF 50mm F1.8 STM', #42
597
597
  '61182.23' => 'Canon RF 14-35mm F4L IS USM', #IB
598
- '61182.24' => 'Canon RF 16mm F2.8 STM', #42
598
+ '61182.24' => 'Canon RF 100-400mm F5.6-8 IS USM', #42
599
+ '61182.25' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
600
+ '61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
601
+ '61182.27' => 'Canon RF 16mm F2.8 STM', #42
599
602
  #'61182.xx' => 'Canon RF 100mm F2.8L MACRO IS USM',
600
603
  65535 => 'n/a',
601
604
  );
@@ -951,6 +954,7 @@ $VERSION = '4.52';
951
954
  0x80000435 => 'EOS Rebel T8i / 850D / X10i', #JR/PH
952
955
  0x80000436 => 'EOS SL3 / 250D / Kiss X10', #25
953
956
  0x80000437 => 'EOS 90D', #IB
957
+ 0x80000450 => 'EOS R3', #42
954
958
  0x80000453 => 'EOS R6', #PH
955
959
  0x80000467 => 'PowerShot ZOOM',
956
960
  0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
@@ -1915,6 +1919,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1915
1919
  Name => 'ColorData10',
1916
1920
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData10' },
1917
1921
  },
1922
+ { # (int16u[3973]) - R3 ref IB
1923
+ Condition => '$count == 3973',
1924
+ Name => 'ColorData11',
1925
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' },
1926
+ },
1918
1927
  {
1919
1928
  Name => 'ColorDataUnknown',
1920
1929
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorDataUnknown' },
@@ -6776,6 +6785,9 @@ my %ciMaxFocal = (
6776
6785
  278 => 'Canon RF 70-200mm F4L IS USM', #42
6777
6786
  280 => 'Canon RF 50mm F1.8 STM', #42
6778
6787
  281 => 'Canon RF 14-35mm F4L IS USM', #42/IB
6788
+ 283 => 'Canon RF 100-400mm F5.6-8 IS USM', #42
6789
+ 284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
6790
+ 285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
6779
6791
  288 => 'Canon RF 16mm F2.8 STM', #42
6780
6792
  #xxx => 'Canon RF 100mm F2.8L MACRO IS USM',
6781
6793
  # Note: add new RF lenses to %canonLensTypes with ID 61182
@@ -7713,7 +7725,10 @@ my %ciMaxFocal = (
7713
7725
  # Color data (MakerNotes tag 0x4001, count=1312,1313,1316) (ref PH)
7714
7726
  %Image::ExifTool::Canon::ColorData7 = (
7715
7727
  %binaryDataAttrs,
7716
- NOTES => 'These tags are used by the EOS 1DX, 5DmkIII, 6D, 100D, 650D, 700D, M and 7DmkII.',
7728
+ NOTES => q{
7729
+ These tags are used by the EOS 1DX, 5DmkIII, 6D, 7DmkII, 100D, 650D, 700D,
7730
+ 8000D, M and M2.
7731
+ },
7717
7732
  FORMAT => 'int16s',
7718
7733
  FIRST_ENTRY => 0,
7719
7734
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7724,8 +7739,8 @@ my %ciMaxFocal = (
7724
7739
  DataMember => 'ColorDataVersion',
7725
7740
  RawConv => '$$self{ColorDataVersion} = $val',
7726
7741
  PrintConv => {
7727
- 10 => '10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M)',
7728
- 11 => '11 (7DmkII/750D/760D)',
7742
+ 10 => '10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M/M2)',
7743
+ 11 => '11 (7DmkII/750D/760D/8000D)',
7729
7744
  },
7730
7745
  },
7731
7746
  # not really sure about the AsShot, Auto and Measured values any more - PH
@@ -7860,6 +7875,10 @@ my %ciMaxFocal = (
7860
7875
  # Color data (MakerNotes tag 0x4001, count=1560,etc) (ref IB)
7861
7876
  %Image::ExifTool::Canon::ColorData8 = (
7862
7877
  %binaryDataAttrs,
7878
+ NOTES => q{
7879
+ These tags are used by the EOS 1DXmkII, 5DS, 5DSR, 5DmkIV, 6DmkII, 77D, 80D,
7880
+ 200D, 800D, 1300D, 2000D, 4000D and 9000D.
7881
+ },
7863
7882
  FORMAT => 'int16s',
7864
7883
  FIRST_ENTRY => 0,
7865
7884
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7870,10 +7889,10 @@ my %ciMaxFocal = (
7870
7889
  DataMember => 'ColorDataVersion',
7871
7890
  RawConv => '$$self{ColorDataVersion} = $val',
7872
7891
  PrintConv => {
7873
- 12 => '12 (5DS/5DSR)',
7874
- 13 => '13 (80D)', #PH
7892
+ 12 => '12 (1DXmkII/5DS/5DSR)',
7893
+ 13 => '13 (80D/5DmkIV)', #PH
7875
7894
  14 => '14 (1300D/2000D/4000D)', #IB
7876
- 15 => '15 (6DmkII/77D/200D/800D)', #IB
7895
+ 15 => '15 (6DmkII/77D/200D/800D,9000D)', #IB
7877
7896
  },
7878
7897
  },
7879
7898
  0x3f => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
@@ -8020,6 +8039,7 @@ my %ciMaxFocal = (
8020
8039
  # Color data (MakerNotes tag 0x4001, count=1820,etc) (ref PH)
8021
8040
  %Image::ExifTool::Canon::ColorData9 = (
8022
8041
  %binaryDataAttrs,
8042
+ NOTES => 'These tags are used by the M6mkII, M50, M200, EOS R, RP, 90D, 250D and 850D',
8023
8043
  FORMAT => 'int16s',
8024
8044
  FIRST_ENTRY => 0,
8025
8045
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -8032,8 +8052,8 @@ my %ciMaxFocal = (
8032
8052
  PrintConv => {
8033
8053
  16 => '16 (M50)',
8034
8054
  17 => '17 (EOS R)', # (and PowerShot SX740HS)
8035
- 18 => '18 (EOS RP)', # (and PowerShot SX70HS)
8036
- 19 => '19 (90D/M6mkII/M200)',# (and PowerShot G7XmkIII)
8055
+ 18 => '18 (EOS RP/250D)', # (and PowerShot SX70HS)
8056
+ 19 => '19 (90D/850D/M6mkII/M200)',# (and PowerShot G7XmkIII)
8037
8057
  },
8038
8058
  },
8039
8059
  0x47 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
@@ -8144,6 +8164,7 @@ my %ciMaxFocal = (
8144
8164
  # (same as ColorData9 but shifted up by 0x0e, ref PH)
8145
8165
  %Image::ExifTool::Canon::ColorData10 = (
8146
8166
  %binaryDataAttrs,
8167
+ NOTES => 'These tags are used by the R5, R5 and EOS 1DXmkIII.',
8147
8168
  FORMAT => 'int16s',
8148
8169
  FIRST_ENTRY => 0,
8149
8170
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -8262,6 +8283,125 @@ my %ciMaxFocal = (
8262
8283
  },
8263
8284
  );
8264
8285
 
8286
+ # Color data (MakerNotes tag 0x4001, count=3973, ref IB)
8287
+ %Image::ExifTool::Canon::ColorData11 = (
8288
+ %binaryDataAttrs,
8289
+ NOTES => 'These tags are used by the EOS R3',
8290
+ FORMAT => 'int16s',
8291
+ FIRST_ENTRY => 0,
8292
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8293
+ DATAMEMBER => [ 0 ],
8294
+ IS_SUBDIR => [ 0x12c ],
8295
+ 0x00 => {
8296
+ Name => 'ColorDataVersion',
8297
+ DataMember => 'ColorDataVersion',
8298
+ RawConv => '$$self{ColorDataVersion} = $val',
8299
+ PrintConv => {
8300
+ 34 => '34 (R3)', #IB
8301
+ },
8302
+ },
8303
+ 0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
8304
+ 0x6d => 'ColorTempAsShot',
8305
+ 0x6e => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' },
8306
+ 0x72 => 'ColorTempAuto',
8307
+ 0x73 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' },
8308
+ 0x77 => 'ColorTempMeasured',
8309
+ 0x78 => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 },
8310
+ 0x7c => { Name => 'ColorTempUnknown', Unknown => 1 },
8311
+ 0x7d => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 },
8312
+ 0x81 => { Name => 'ColorTempUnknown2', Unknown => 1 },
8313
+ 0x82 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 },
8314
+ 0x86 => { Name => 'ColorTempUnknown3', Unknown => 1 },
8315
+ 0x87 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 },
8316
+ 0x8b => { Name => 'ColorTempUnknown4', Unknown => 1 },
8317
+ 0x8c => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 },
8318
+ 0x90 => { Name => 'ColorTempUnknown5', Unknown => 1 },
8319
+ 0x91 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 },
8320
+ 0x95 => { Name => 'ColorTempUnknown6', Unknown => 1 },
8321
+ 0x96 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 },
8322
+ 0x9a => { Name => 'ColorTempUnknown7', Unknown => 1 },
8323
+ 0x9b => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 },
8324
+ 0x9f => { Name => 'ColorTempUnknown8', Unknown => 1 },
8325
+ 0xa0 => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 },
8326
+ 0xa4 => { Name => 'ColorTempUnknown9', Unknown => 1 },
8327
+ 0xa5 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 },
8328
+ 0xa9 => { Name => 'ColorTempUnknown10', Unknown => 1 },
8329
+ 0xaa => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 },
8330
+ 0xae => { Name => 'ColorTempUnknown11', Unknown => 1 },
8331
+ 0xaf => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 },
8332
+ 0xb3 => { Name => 'ColorTempUnknown11', Unknown => 1 },
8333
+ 0xb4 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 },
8334
+ 0xb8 => { Name => 'ColorTempUnknown12', Unknown => 1 },
8335
+ 0xb9 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 },
8336
+ 0xbd => { Name => 'ColorTempUnknown13', Unknown => 1 },
8337
+ 0xbe => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 },
8338
+ 0xc2 => { Name => 'ColorTempUnknown14', Unknown => 1 },
8339
+ 0xc3 => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 },
8340
+ 0xc7 => { Name => 'ColorTempUnknown15', Unknown => 1 },
8341
+ 0xc8 => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 },
8342
+ 0xcc => { Name => 'ColorTempUnknown16', Unknown => 1 },
8343
+ 0xcd => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' },
8344
+ 0xd1 => 'ColorTempDaylight',
8345
+ 0xd2 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' },
8346
+ 0xd6 => 'ColorTempShade',
8347
+ 0xd7 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' },
8348
+ 0xdb => 'ColorTempCloudy',
8349
+ 0xdc => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' },
8350
+ 0xe0 => 'ColorTempTungsten',
8351
+ 0xe1 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' },
8352
+ 0xe5 => 'ColorTempFluorescent',
8353
+ 0xe6 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' },
8354
+ 0xea => 'ColorTempKelvin',
8355
+ 0xeb => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' },
8356
+ 0xef => 'ColorTempFlash',
8357
+ 0xf0 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 },
8358
+ 0xf4 => { Name => 'ColorTempUnknown17', Unknown => 1 },
8359
+ 0xf5 => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 },
8360
+ 0xf9 => { Name => 'ColorTempUnknown18', Unknown => 1 },
8361
+ 0xfa => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 },
8362
+ 0xfe => { Name => 'ColorTempUnknown19', Unknown => 1 },
8363
+ 0xff => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 },
8364
+ 0x103 => { Name => 'ColorTempUnknown20', Unknown => 1 },
8365
+ 0x104 => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 },
8366
+ 0x108 => { Name => 'ColorTempUnknown21', Unknown => 1 },
8367
+ 0x109 => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 },
8368
+ 0x10d => { Name => 'ColorTempUnknown22', Unknown => 1 },
8369
+ 0x10e => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 },
8370
+ 0x112 => { Name => 'ColorTempUnknown23', Unknown => 1 },
8371
+ 0x113 => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 },
8372
+ 0x117 => { Name => 'ColorTempUnknown24', Unknown => 1 },
8373
+ 0x118 => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 },
8374
+ 0x11c => { Name => 'ColorTempUnknown25', Unknown => 1 },
8375
+ 0x11d => { Name => 'WB_RGGBLevelsUnknown26', Format => 'int16s[4]', Unknown => 1 },
8376
+ 0x121 => { Name => 'ColorTempUnknown26', Unknown => 1 },
8377
+ 0x122 => { Name => 'WB_RGGBLevelsUnknown27', Format => 'int16s[4]', Unknown => 1 },
8378
+ 0x126 => { Name => 'ColorTempUnknown27', Unknown => 1 },
8379
+ 0x12c => {
8380
+ Name => 'ColorCalib',
8381
+ Format => 'undef[120]',
8382
+ Unknown => 1,
8383
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
8384
+ },
8385
+ 0x16b => {
8386
+ Name => 'PerChannelBlackLevel',
8387
+ Format => 'int16u[4]',
8388
+ },
8389
+ # 0x27c - PerChannelBlackLevel again
8390
+ 0x280 => {
8391
+ Name => 'NormalWhiteLevel',
8392
+ Format => 'int16u',
8393
+ RawConv => '$val || undef',
8394
+ },
8395
+ 0x281 => {
8396
+ Name => 'SpecularWhiteLevel',
8397
+ Format => 'int16u',
8398
+ },
8399
+ 0x282 => {
8400
+ Name => 'LinearityUpperMargin',
8401
+ Format => 'int16u',
8402
+ },
8403
+ );
8404
+
8265
8405
  # Unknown color data (MakerNotes tag 0x4001)
8266
8406
  %Image::ExifTool::Canon::ColorDataUnknown = (
8267
8407
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -8752,6 +8892,7 @@ my %filterConv = (
8752
8892
  # --> ignored when reading, but offsets are updated when writing
8753
8893
  CMT1 => { # (CR3 files)
8754
8894
  Name => 'IFD0',
8895
+ PreservePadding => 1,
8755
8896
  SubDirectory => {
8756
8897
  TagTable => 'Image::ExifTool::Exif::Main',
8757
8898
  ProcessProc => \&Image::ExifTool::ProcessTIFF,
@@ -8760,6 +8901,7 @@ my %filterConv = (
8760
8901
  },
8761
8902
  CMT2 => { # (CR3 files)
8762
8903
  Name => 'ExifIFD',
8904
+ PreservePadding => 1,
8763
8905
  SubDirectory => {
8764
8906
  TagTable => 'Image::ExifTool::Exif::Main',
8765
8907
  ProcessProc => \&Image::ExifTool::ProcessTIFF,
@@ -8768,6 +8910,7 @@ my %filterConv = (
8768
8910
  },
8769
8911
  CMT3 => { # (CR3 files)
8770
8912
  Name => 'MakerNoteCanon',
8913
+ PreservePadding => 1,
8771
8914
  SubDirectory => {
8772
8915
  TagTable => 'Image::ExifTool::Canon::Main',
8773
8916
  ProcessProc => \&ProcessCMT3,
@@ -8776,6 +8919,7 @@ my %filterConv = (
8776
8919
  },
8777
8920
  CMT4 => { # (CR3 files)
8778
8921
  Name => 'GPSInfo',
8922
+ PreservePadding => 1,
8779
8923
  SubDirectory => {
8780
8924
  TagTable => 'Image::ExifTool::GPS::Main',
8781
8925
  ProcessProc => \&Image::ExifTool::ProcessTIFF,
@@ -8786,6 +8930,7 @@ my %filterConv = (
8786
8930
  THMB => {
8787
8931
  Name => 'ThumbnailImage',
8788
8932
  Groups => { 2 => 'Preview' },
8933
+ PreservePadding => 1,
8789
8934
  RawConv => 'substr($val, 16)',
8790
8935
  Binary => 1,
8791
8936
  },
@@ -8800,6 +8945,7 @@ my %filterConv = (
8800
8945
  WRITE_PROC => 'Image::ExifTool::QuickTime::WriteQuickTime',
8801
8946
  CNOP => {
8802
8947
  Name => 'CanonVRD',
8948
+ PreservePadding => 1,
8803
8949
  SubDirectory => {
8804
8950
  TagTable => 'Image::ExifTool::CanonVRD::Main',
8805
8951
  WriteProc => 'Image::ExifTool::CanonVRD::WriteCanonDR4',
@@ -6,6 +6,8 @@
6
6
  # Revisions: 2009/08/28 - P. Harvey created
7
7
  # 2010/01/20 - P. Harvey complete re-write
8
8
  # 2010/07/16 - P. Harvey added UTF-16 support
9
+ #
10
+ # Notes: Charset lookups are generated using my convertCharset script
9
11
  #------------------------------------------------------------------------------
10
12
 
11
13
  package Image::ExifTool::Charset;
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool::XMP;
17
17
 
18
- $VERSION = '1.05';
18
+ $VERSION = '1.06';
19
19
 
20
20
  my %dateTimeInfo = (
21
21
  # NOTE: Do NOT put "Groups" here because Groups hash must not be common!
@@ -38,7 +38,7 @@ my %event = (
38
38
  earliestDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
39
39
  endDayOfYear => { Writable => 'integer', Groups => { 2 => 'Time' } },
40
40
  eventDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
41
- eventID => { },
41
+ eventID => { Avoid => 1, Notes => 'avoided in favor of XMP-iptcExt:EventID' },
42
42
  eventRemarks => { Writable => 'lang-alt' },
43
43
  eventTime => {
44
44
  Groups => { 2 => 'Time' },
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
56
56
  use Image::ExifTool qw(:DataAccess :Utils);
57
57
  use Image::ExifTool::MakerNotes;
58
58
 
59
- $VERSION = '4.37';
59
+ $VERSION = '4.38';
60
60
 
61
61
  sub ProcessExif($$$);
62
62
  sub WriteExif($$$);
@@ -4816,11 +4816,23 @@ my %subSecConv = (
4816
4816
  },
4817
4817
  GPSPosition => {
4818
4818
  Groups => { 2 => 'Location' },
4819
+ Writable => 1,
4820
+ WriteAlso => {
4821
+ GPSLatitude => '$val =~ /(.*?)( ?[NS])?,/ ? $1 : undef',
4822
+ GPSLatitudeRef => '$val =~ /(-?)(.*?) ?([NS]?),/ ? ($3 || ($1 ? "S" : "N")) : undef',
4823
+ GPSLongitude => '$val =~ /, ?(.*?)( ?[EW]?)$/ ? $1 : undef',
4824
+ GPSLongitudeRef => '$val =~ /, ?(-?)(.*?) ?([EW]?)$/ ? ($3 || ($1 ? "W" : "E")) : undef',
4825
+ },
4819
4826
  Require => {
4820
4827
  0 => 'GPSLatitude',
4821
4828
  1 => 'GPSLongitude',
4822
4829
  },
4823
4830
  Priority => 0,
4831
+ Notes => q{
4832
+ when written, writes GPSLatitude, GPSLatitudeRef, GPSLongitude and
4833
+ GPSLongitudeRef. This tag may be written using the same coordinate
4834
+ format as provided by Google Maps when right-clicking on a location
4835
+ },
4824
4836
  ValueConv => '(length($val[0]) or length($val[1])) ? "$val[0] $val[1]" : undef',
4825
4837
  PrintConv => '"$prt[0], $prt[1]"',
4826
4838
  },
@@ -24,7 +24,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
24
24
  use Image::ExifTool::Exif;
25
25
  use Image::ExifTool::GPS;
26
26
 
27
- $VERSION = '1.18';
27
+ $VERSION = '1.19';
28
28
 
29
29
  sub ProcessFLIR($$;$);
30
30
  sub ProcessFLIRText($$$);
@@ -99,7 +99,7 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
99
99
  NOTES => q{
100
100
  Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
101
101
  images. These tags may also be extracted from the first frame of an FLIR
102
- SEQ file.
102
+ SEQ file, or all frames if the ExtractEmbedded option is used.
103
103
  },
104
104
  "_header" => {
105
105
  Name => 'FFFHeader',
@@ -1457,6 +1457,7 @@ sub ProcessFLIR($$;$)
1457
1457
  my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
1458
1458
  my $verbose = $et->Options('Verbose');
1459
1459
  my $out = $et->Options('TextOut');
1460
+ my $base = $raf->Tell();
1460
1461
  my ($i, $hdr, $buff, $rec);
1461
1462
 
1462
1463
  # read and verify FFF header
@@ -1485,15 +1486,18 @@ sub ProcessFLIR($$;$)
1485
1486
  my $ver = Get32u(\$hdr, 0x14);
1486
1487
  last if $ver >= 100 and $ver < 200; # (have seen 100 and 101 - PH)
1487
1488
  ToggleByteOrder();
1488
- $i and $et->Warn("Unsupported FLIR $type version"), return 1;
1489
+ next unless $i;
1490
+ return 0 if $$et{DOC_NUM};
1491
+ $et->Warn("Unsupported FLIR $type version");
1492
+ return 1;
1489
1493
  }
1490
1494
 
1491
1495
  # read the FLIR record directory
1492
1496
  my $pos = Get32u(\$hdr, 0x18);
1493
1497
  my $num = Get32u(\$hdr, 0x1c);
1494
- unless ($raf->Seek($pos) and $raf->Read($buff, $num * 0x20) == $num * 0x20) {
1498
+ unless ($raf->Seek($base+$pos) and $raf->Read($buff, $num * 0x20) == $num * 0x20) {
1495
1499
  $et->Warn('Truncated FLIR FFF directory');
1496
- return 1;
1500
+ return $$et{DOC_NUM} ? 0 : 1;
1497
1501
  }
1498
1502
 
1499
1503
  unless ($tagTablePtr) {
@@ -1504,6 +1508,7 @@ sub ProcessFLIR($$;$)
1504
1508
  # process the header data
1505
1509
  $et->HandleTag($tagTablePtr, '_header', $hdr);
1506
1510
 
1511
+ my $success = 1;
1507
1512
  my $oldIndent = $$et{INDENT};
1508
1513
  $$et{INDENT} .= '| ';
1509
1514
  $et->VerboseDir($type, $num);
@@ -1533,12 +1538,22 @@ sub ProcessFLIR($$;$)
1533
1538
  $verbose and printf $out "%s%d) FLIR Record 0x%.2x, offset 0x%.4x, length 0x%.4x\n",
1534
1539
  $$et{INDENT}, $i, $recType, $recPos, $recLen;
1535
1540
 
1536
- unless ($raf->Seek($recPos) and $raf->Read($rec, $recLen) == $recLen) {
1537
- $et->Warn('Invalid FLIR record');
1541
+ # skip RawData records for embedded documents
1542
+ if ($recType == 1 and $$et{DOC_NUM}) {
1543
+ $raf->Seek($base+$recPos+$recLen) or $success = 0, last;
1544
+ next;
1545
+ }
1546
+ unless ($raf->Seek($base+$recPos) and $raf->Read($rec, $recLen) == $recLen) {
1547
+ if ($$et{DOC_NUM}) {
1548
+ $success = 0; # abort processing more documents
1549
+ } else {
1550
+ $et->Warn('Invalid FLIR record');
1551
+ }
1538
1552
  last;
1539
1553
  }
1540
1554
  if ($$tagTablePtr{$recType}) {
1541
1555
  $et->HandleTag($tagTablePtr, $recType, undef,
1556
+ Base => $base,
1542
1557
  DataPt => \$rec,
1543
1558
  DataPos => $recPos,
1544
1559
  Start => 0,
@@ -1550,7 +1565,17 @@ sub ProcessFLIR($$;$)
1550
1565
  }
1551
1566
  delete $$et{SET_GROUP0};
1552
1567
  $$et{INDENT} = $oldIndent;
1553
- return 1;
1568
+
1569
+ # extract information from subsequent frames in SEQ file if ExtractEmbedded is used
1570
+ if ($$dirInfo{RAF} and $et->Options('ExtractEmbedded') and not $$et{DOC_NUM}) {
1571
+ for (;;) {
1572
+ $$et{DOC_NUM} = $$et{DOC_COUNT} + 1;
1573
+ last unless ProcessFLIR($et, $dirInfo, $tagTablePtr);
1574
+ # (DOC_COUNT will be incremented automatically if we extracted any tags)
1575
+ }
1576
+ delete $$et{DOC_NUM};
1577
+ }
1578
+ return $success;
1554
1579
  }
1555
1580
 
1556
1581
  #------------------------------------------------------------------------------
@@ -20,7 +20,7 @@ use strict;
20
20
  use vars qw($VERSION);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
 
23
- $VERSION = '1.18';
23
+ $VERSION = '1.19';
24
24
 
25
25
  # road map of directory locations in GIF images
26
26
  my %gifMap = (
@@ -54,6 +54,7 @@ my %gifMap = (
54
54
  Extensions => { # (for documentation only)
55
55
  SubDirectory => { TagTable => 'Image::ExifTool::GIF::Extensions' },
56
56
  },
57
+ TransparentColor => { },
57
58
  );
58
59
 
59
60
  # GIF89a application extensions:
@@ -475,6 +476,9 @@ Block:
475
476
  my $delay = Get16u(\$buff, 1);
476
477
  $delayTime += $delay;
477
478
  $verbose and printf $out "Graphic Control: delay=%.2f\n", $delay / 100;
479
+ # get transparent colour
480
+ my $bits = Get8u(\$buff, 0);
481
+ $et->HandleTag($tagTablePtr, 'TransparentColor', Get8u(\$buff,3)) if $bits & 0x01;
478
482
  $raf->Seek(-$length, 1) or last;
479
483
 
480
484
  } elsif ($a == 0x01 and $length == 12) { # plain text extension
@@ -137,22 +137,26 @@ my %coordConv = (
137
137
  my ($v, $et) = @_;
138
138
  $v = $et->TimeNow() if lc($v) eq 'now';
139
139
  my @tz;
140
- if ($v =~ s/([-+])(.*)//s) { # remove timezone
140
+ if ($v =~ s/([-+])(\d{1,2}):?(\d{2})\s*(DST)?$//i) { # remove timezone
141
141
  my $s = $1 eq '-' ? 1 : -1; # opposite sign to convert back to UTC
142
142
  my $t = $2;
143
- @tz = ($s*$1, $s*$2) if $t =~ /^(\d{2}):?(\d{2})\s*$/;
143
+ @tz = ($s*$2, $s*$3);
144
144
  }
145
- my @a = ($v =~ /((?=\d|\.\d)\d*(?:\.\d*)?)/g);
146
- push @a, '00' while @a < 3;
145
+ # (note: we must allow '.' as a time separator, eg. '10.30.00', with is tricky due to decimal seconds)
146
+ # YYYYmmddHHMMSS[.ss] format
147
+ my @a = ($v =~ /^[^\d]*\d{4}[^\d]*\d{1,2}[^\d]*\d{1,2}[^\d]*(\d{1,2})[^\d]*(\d{2})[^\d]*(\d{2}(?:\.\d+)?)[^\d]*$/);
148
+ # HHMMSS[.ss] format
149
+ @a or @a = ($v =~ /^[^\d]*(\d{1,2})[^\d]*(\d{2})[^\d]*(\d{2}(?:\.\d+)?)[^\d]*$/);
150
+ @a or warn('Invalid time (use HH:MM:SS[.ss][+/-HH:MM|Z])'), return undef;
147
151
  if (@tz) {
148
152
  # adjust to UTC
149
- $a[-2] += $tz[1];
150
- $a[-3] += $tz[0];
151
- while ($a[-2] >= 60) { $a[-2] -= 60; ++$a[-3] }
152
- while ($a[-2] < 0) { $a[-2] += 60; --$a[-3] }
153
- $a[-3] = ($a[-3] + 24) % 24;
153
+ $a[1] += $tz[1];
154
+ $a[0] += $tz[0];
155
+ while ($a[1] >= 60) { $a[1] -= 60; ++$a[0] }
156
+ while ($a[1] < 0) { $a[1] += 60; --$a[0] }
157
+ $a[0] = ($a[0] + 24) % 24;
154
158
  }
155
- return "$a[-3]:$a[-2]:$a[-1]";
159
+ return join(':', @a);
156
160
  },
157
161
  },
158
162
  0x0008 => {