exiftool-vendored.pl 12.84.0 → 12.89.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 +94 -3
  2. package/bin/MANIFEST +1 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +16 -16
  5. package/bin/README +47 -46
  6. package/bin/build_geolocation +96 -20
  7. package/bin/config_files/example.config +5 -0
  8. package/bin/config_files/onone.config +28 -0
  9. package/bin/exiftool +67 -57
  10. package/bin/lib/Image/ExifTool/AIFF.pm +8 -4
  11. package/bin/lib/Image/ExifTool/ASF.pm +4 -1
  12. package/bin/lib/Image/ExifTool/Apple.pm +2 -1
  13. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +14 -8
  14. package/bin/lib/Image/ExifTool/Canon.pm +100 -7
  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/DPX.pm +3 -3
  18. package/bin/lib/Image/ExifTool/FujiFilm.pm +46 -4
  19. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  20. package/bin/lib/Image/ExifTool/Geolocation.pm +18 -8
  21. package/bin/lib/Image/ExifTool/ID3.pm +36 -8
  22. package/bin/lib/Image/ExifTool/InDesign.pm +8 -4
  23. package/bin/lib/Image/ExifTool/Jpeg2000.pm +0 -1
  24. package/bin/lib/Image/ExifTool/Lang/de.pm +2 -2
  25. package/bin/lib/Image/ExifTool/Matroska.pm +66 -10
  26. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  27. package/bin/lib/Image/ExifTool/Nikon.pm +21 -2
  28. package/bin/lib/Image/ExifTool/Olympus.pm +27 -17
  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 +139 -22
  32. package/bin/lib/Image/ExifTool/QuickTime.pm +70 -16
  33. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +24 -2
  34. package/bin/lib/Image/ExifTool/RIFF.pm +20 -10
  35. package/bin/lib/Image/ExifTool/Samsung.pm +29 -1
  36. package/bin/lib/Image/ExifTool/Sony.pm +21 -11
  37. package/bin/lib/Image/ExifTool/TagLookup.pm +6806 -6782
  38. package/bin/lib/Image/ExifTool/TagNames.pod +124 -34
  39. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  40. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +86 -16
  41. package/bin/lib/Image/ExifTool/Writer.pl +8 -6
  42. package/bin/lib/Image/ExifTool/XMP.pm +10 -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 +78 -45
  46. package/bin/lib/Image/ExifTool.pod +66 -50
  47. package/bin/perl-Image-ExifTool.spec +45 -45
  48. package/bin/pp_build_exe.args +4 -4
  49. package/package.json +3 -3
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 27855 tags, with 17441 unique tag names.
15
+ They contain a total of 27892 tags, with 17459 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -1390,6 +1390,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
1390
1390
  fpv XMP fpv
1391
1391
  GAudio XMP GAudio
1392
1392
  GCamera XMP GCamera
1393
+ GContainer XMP GContainer
1393
1394
  GCreations XMP GCreations
1394
1395
  GDepth XMP GDepth
1395
1396
  getty XMP GettyImages
@@ -4794,6 +4795,7 @@ These tags belong to the ExifTool XMP-GCamera family 1 group.
4794
4795
  BurstID string
4795
4796
  BurstPrimary string
4796
4797
  DisableAutoCreation string+
4798
+ DisableSuggestedAction string+
4797
4799
  HDRPMakerNote string
4798
4800
  HdrPlusMakernote string
4799
4801
  MicroVideo integer
@@ -4809,6 +4811,42 @@ These tags belong to the ExifTool XMP-GCamera family 1 group.
4809
4811
  ShotLogData string
4810
4812
  SpecialTypeID string+
4811
4813
 
4814
+ =head3 XMP GContainer Tags
4815
+
4816
+ Google Container namespace. ExifTool uses the prefix 'GContainer' instead
4817
+ of 'Container' to avoid a conflict with the Google Device Container
4818
+ namespace.
4819
+
4820
+ These tags belong to the ExifTool XMP-GContainer family 1 group.
4821
+
4822
+ Tag Name Writable
4823
+ -------- --------
4824
+ ContainerDirectory Directory Struct+
4825
+ DirectoryItem Item Struct_+
4826
+ DirectoryItemLabel string_+
4827
+ DirectoryItemLength integer_+
4828
+ DirectoryItemMime string_+
4829
+ DirectoryItemPadding integer_+
4830
+ DirectoryItemSemantic string_+
4831
+ DirectoryItemURI string_+
4832
+
4833
+ =head3 XMP Directory Struct
4834
+
4835
+ Field Name Writable
4836
+ ---------- --------
4837
+ Item Item Struct
4838
+
4839
+ =head3 XMP Item Struct
4840
+
4841
+ Field Name Writable
4842
+ ---------- --------
4843
+ Label string
4844
+ Length integer
4845
+ Mime string
4846
+ Padding integer
4847
+ Semantic string
4848
+ URI string
4849
+
4812
4850
  =head3 XMP GCreations Tags
4813
4851
 
4814
4852
  Google creations tags.
@@ -7746,7 +7784,8 @@ These tags are used in Pentax/Asahi cameras.
7746
7784
  0x0229 SerialNumber string
7747
7785
  0x022a FilterInfo Pentax FilterInfo
7748
7786
  Pentax FilterInfo
7749
- 0x022b LevelInfo Pentax LevelInfo
7787
+ 0x022b LevelInfoK3III Pentax LevelInfoK3III
7788
+ LevelInfo Pentax LevelInfo
7750
7789
  0x022d WBLevels Pentax WBLevels
7751
7790
  0x022e Artist string
7752
7791
  0x022f Copyright string
@@ -7919,7 +7958,8 @@ Auto-exposure information for the K-01.
7919
7958
 
7920
7959
  =head3 Pentax AEInfo3 Tags
7921
7960
 
7922
- Auto-exposure information for the K-3, K-30, K-50 and K-500.
7961
+ Auto-exposure information for the K-1mkII, K-3, K-30, K-50, K-70, K-500 and
7962
+ KP.
7923
7963
 
7924
7964
  Index1 Tag Name Writable
7925
7965
  ------ -------- --------
@@ -8050,17 +8090,23 @@ Flash information tags for the K10D, K20D and K200D.
8050
8090
  Index1 Tag Name Writable
8051
8091
  ------ -------- --------
8052
8092
  0.1 PowerSource int8u & 0x0f
8093
+ 0.2 PowerAvailable int8u & 0xf0
8053
8094
  1.1 BodyBatteryState int8u & 0xf0
8054
8095
  1.2 GripBatteryState int8u & 0x0f
8055
- GripBatteryState? int8u & 0x0f
8056
8096
  2 BodyBatteryADNoLoad int8u
8057
8097
  BodyBatteryVoltage1 int16u
8098
+ BodyBatteryState int8u
8058
8099
  3 BodyBatteryADLoad int8u
8100
+ BodyBatteryPercent int8u
8059
8101
  4 GripBatteryADNoLoad int8u
8060
8102
  BodyBatteryVoltage2 int16u
8103
+ BodyBatteryVoltage int32u
8061
8104
  5 GripBatteryADLoad int8u
8062
8105
  6 BodyBatteryVoltage3 int16u
8063
8106
  8 BodyBatteryVoltage4 int16u
8107
+ 16 GripBatteryState int8u
8108
+ 17 GripBatteryPercent int8u
8109
+ 18 GripBatteryVoltage int32u
8064
8110
 
8065
8111
  =head3 Pentax AFInfo Tags
8066
8112
 
@@ -8072,6 +8118,7 @@ Flash information tags for the K10D, K20D and K200D.
8072
8118
  6 AFDefocus int8u
8073
8119
  7 AFIntegrationTime int8u
8074
8120
  11 AFPointsInFocus int8u
8121
+ 506 LiveView int8u
8075
8122
  509 AFHold int8u
8076
8123
 
8077
8124
  =head3 Pentax KelvinWB Tags
@@ -8111,6 +8158,7 @@ White balance Blue/Red gains as a function of color temperature.
8111
8158
  ------ -------- --------
8112
8159
  0 EVSteps int8u
8113
8160
  1 SensitivitySteps int8u
8161
+ 3 LiveView int8u
8114
8162
 
8115
8163
  =head3 Pentax ShotInfo Tags
8116
8164
 
@@ -8224,6 +8272,16 @@ used.
8224
8272
  311 DigitalFilter19 undef[17]
8225
8273
  328 DigitalFilter20 undef[17]
8226
8274
 
8275
+ =head3 Pentax LevelInfoK3III Tags
8276
+
8277
+ Tags decoded from the electronic level information for the K-3 III.
8278
+
8279
+ Index1 Tag Name Writable
8280
+ ------ -------- --------
8281
+ 1 CameraOrientation int8s
8282
+ 3 RollAngle int16s
8283
+ 5 PitchAngle int16s
8284
+
8227
8285
  =head3 Pentax LevelInfo Tags
8228
8286
 
8229
8287
  Tags decoded from the electronic level information for the K-5. May not be
@@ -9296,6 +9354,7 @@ Unknown only to reduce the volume of the normal output.
9296
9354
  0x4026 LogInfo Canon LogInfo
9297
9355
  0x4028 AFConfig Canon AFConfig
9298
9356
  0x403f RawBurstModeRoll Canon RawBurstInfo
9357
+ 0x4059 LevelInfo Canon LevelInfo
9299
9358
 
9300
9359
  =head3 Canon CameraSettings Tags
9301
9360
 
@@ -9338,6 +9397,7 @@ Unknown only to reduce the volume of the normal output.
9338
9397
  41 ManualFlashOutput int16s
9339
9398
  42 ColorTone int16s
9340
9399
  46 SRAWQuality int16s
9400
+ 51 Clarity int16s
9341
9401
 
9342
9402
  =head3 Canon FocalLength Tags
9343
9403
 
@@ -10181,7 +10241,7 @@ CameraInfo tags for the EOS 1000D.
10181
10241
 
10182
10242
  =head3 Canon CameraInfoR6 Tags
10183
10243
 
10184
- CameraInfo tags for the EOS R6.
10244
+ CameraInfo tags for the EOS R5 and R6.
10185
10245
 
10186
10246
  Index1 Tag Name Writable
10187
10247
  ------ -------- --------
@@ -10460,6 +10520,8 @@ WB tags for the Canon G9.
10460
10520
  11 DigitalGain int16s
10461
10521
  12 WBShiftAB int16s
10462
10522
  13 WBShiftGM int16s
10523
+ 14 UnsharpMaskFineness int16s
10524
+ 15 UnsharpMaskThreshold int16s
10463
10525
 
10464
10526
  =head3 Canon ColorBalance Tags
10465
10527
 
@@ -11521,6 +11583,8 @@ Information about creative filter settings.
11521
11583
  17 VFDisplayIllumination int32s
11522
11584
  18 AFStatusViewfinder int32s
11523
11585
  19 InitialAFPointInServo int32s
11586
+ 20 SubjectToDetect int32s
11587
+ 24 EyeDetection int32s
11524
11588
 
11525
11589
  =head3 Canon RawBurstInfo Tags
11526
11590
 
@@ -11529,6 +11593,16 @@ Information about creative filter settings.
11529
11593
  1 RawBurstImageNum int32u
11530
11594
  2 RawBurstImageCount int32u
11531
11595
 
11596
+ =head3 Canon LevelInfo Tags
11597
+
11598
+ Index4 Tag Name Writable
11599
+ ------ -------- --------
11600
+ 4 RollAngle int32s
11601
+ 5 PitchAngle int32s
11602
+ 7 FocalLength int32s
11603
+ 8 MinFocalLength int32s
11604
+ 9 MaxFocalLength int32s
11605
+
11532
11606
  =head3 Canon CTMD Tags
11533
11607
 
11534
11608
  Canon Timed MetaData tags found in CR3 images. The ExtractEmbedded option
@@ -13298,6 +13372,15 @@ Face recognition information.
13298
13372
  Face8Category no
13299
13373
  Face8Name no
13300
13374
 
13375
+ =head3 FujiFilm RAFHeader Tags
13376
+
13377
+ Tags extracted from the header of RAF images.
13378
+
13379
+ Index1 Tag Name Writable
13380
+ ------ -------- --------
13381
+ 60 RAFVersion no
13382
+ 108 RAFCompression no
13383
+
13301
13384
  =head3 FujiFilm RAF Tags
13302
13385
 
13303
13386
  FujiFilm RAF images contain meta information stored in a proprietary
@@ -15930,7 +16013,7 @@ Tags written by some Nikon GPS-equipped cameras like the AW100.
15930
16013
  Index1 Tag Name Writable
15931
16014
  ------ -------- --------
15932
16015
  0 FirmwareVersion51 no
15933
- 10 NEFCompression int16u[0.5]
16016
+ 10 NEFCompression int16u
15934
16017
 
15935
16018
  =head3 Nikon MakerNotes0x56 Tags
15936
16019
 
@@ -19821,23 +19904,23 @@ any information found here will be extracted, even if the tag is not listed.
19821
19904
  Tag ID Tag Name Writable
19822
19905
  ------ -------- --------
19823
19906
  0x0000 ImageProcessingVersion undef[4]
19824
- 0x0100 WB_RBLevels int16u[2]
19825
- 0x0102 WB_RBLevels3000K int16u[2]
19826
- 0x0103 WB_RBLevels3300K int16u[2]
19827
- 0x0104 WB_RBLevels3600K int16u[2]
19828
- 0x0105 WB_RBLevels3900K int16u[2]
19829
- 0x0106 WB_RBLevels4000K int16u[2]
19830
- 0x0107 WB_RBLevels4300K int16u[2]
19831
- 0x0108 WB_RBLevels4500K int16u[2]
19832
- 0x0109 WB_RBLevels4800K int16u[2]
19833
- 0x010a WB_RBLevels5300K int16u[2]
19834
- 0x010b WB_RBLevels6000K int16u[2]
19835
- 0x010c WB_RBLevels6600K int16u[2]
19836
- 0x010d WB_RBLevels7500K int16u[2]
19837
- 0x010e WB_RBLevelsCWB1 int16u[2]
19838
- 0x010f WB_RBLevelsCWB2 int16u[2]
19839
- 0x0110 WB_RBLevelsCWB3 int16u[2]
19840
- 0x0111 WB_RBLevelsCWB4 int16u[2]
19907
+ 0x0100 WB_RBLevels int16u[n]
19908
+ 0x0102 WB_RBLevels3000K int16u[n]
19909
+ 0x0103 WB_RBLevels3300K int16u[n]
19910
+ 0x0104 WB_RBLevels3600K int16u[n]
19911
+ 0x0105 WB_RBLevels3900K int16u[n]
19912
+ 0x0106 WB_RBLevels4000K int16u[n]
19913
+ 0x0107 WB_RBLevels4300K int16u[n]
19914
+ 0x0108 WB_RBLevels4500K int16u[n]
19915
+ 0x0109 WB_RBLevels4800K int16u[n]
19916
+ 0x010a WB_RBLevels5300K int16u[n]
19917
+ 0x010b WB_RBLevels6000K int16u[n]
19918
+ 0x010c WB_RBLevels6600K int16u[n]
19919
+ 0x010d WB_RBLevels7500K int16u[n]
19920
+ 0x010e WB_RBLevelsCWB1 int16u[n]
19921
+ 0x010f WB_RBLevelsCWB2 int16u[n]
19922
+ 0x0110 WB_RBLevelsCWB3 int16u[n]
19923
+ 0x0111 WB_RBLevelsCWB4 int16u[n]
19841
19924
  0x0113 WB_GLevel3000K int16u
19842
19925
  0x0114 WB_GLevel3300K int16u
19843
19926
  0x0115 WB_GLevel3600K int16u
@@ -20210,6 +20293,7 @@ These tags are found in IFD0 of Panasonic/Leica RAW, RW2 and RWL images.
20210
20293
  0x0030 CropLeft int16u
20211
20294
  0x0031 CropBottom int16u
20212
20295
  0x0032 CropRight int16u
20296
+ 0x0037 ISO int32u
20213
20297
  0x010f Make string
20214
20298
  0x0110 Model string
20215
20299
  0x0111 StripOffsets no
@@ -22872,7 +22956,7 @@ E-mount models.
22872
22956
 
22873
22957
  =head3 Sony Tag9416 Tags
22874
22958
 
22875
- Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1.
22959
+ Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1/E10M2.
22876
22960
 
22877
22961
  Index1 Tag Name Writable
22878
22962
  ------ -------- --------
@@ -23170,7 +23254,8 @@ The following tags are decoded in unsupported maker notes. Use the Unknown
23170
23254
 
23171
23255
  The main DNG tags are found in the EXIF table. The tables below define only
23172
23256
  information found within structures of these main DNG tag values. See
23173
- L<http://www.adobe.com/products/dng/> for the official DNG specification.
23257
+ L<https://helpx.adobe.com/camera-raw/digital-negative.html> for the official
23258
+ DNG specification.
23174
23259
 
23175
23260
  =head3 DNG AdobeData Tags
23176
23261
 
@@ -23591,7 +23676,7 @@ These tags are used in Minolta RAW format (MRW) images.
23591
23676
  4 WBMode int8u~
23592
23677
  5 ProgramMode int8u
23593
23678
  6 ISOSetting int8u
23594
- 7 ColorMode int32u[0.25]
23679
+ 7 ColorMode int8u
23595
23680
  8 WB_RBLevelsTungsten int16u[2]
23596
23681
  12 WB_RBLevelsDaylight int16u[2]
23597
23682
  16 WB_RBLevelsCloudy int16u[2]
@@ -25732,7 +25817,7 @@ the image undisplayable.
25732
25817
  2 ColorSpecApproximation int8s!
25733
25818
  3 ICC_Profile ICC_Profile
25734
25819
  ColorSpace int32u!
25735
- ColorSpecData undef!
25820
+ ColorSpecData undef[$size-3]!
25736
25821
 
25737
25822
  =head3 Jpeg2000 FileType Tags
25738
25823
 
@@ -29414,11 +29499,11 @@ parameters, as well as proprietary information written by many camera
29414
29499
  models. Tags with a question mark after their name are not extracted unless
29415
29500
  the Unknown option is set.
29416
29501
 
29417
- When writing, ExifTool creates both QuickTime and XMP tags by default, but
29418
- the group may be specified to write one or the other separately. If no
29419
- location is specified, newly created QuickTime tags are added in the
29420
- L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> location if
29421
- possible, otherwise in
29502
+ When writing video files, ExifTool creates both QuickTime and XMP tags by
29503
+ default, but the group may be specified to write one or the other
29504
+ separately. If no location is specified, newly created QuickTime tags are
29505
+ added in the L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags>
29506
+ location if possible, otherwise in
29422
29507
  L<UserData|Image::ExifTool::TagNames/QuickTime UserData Tags>, and
29423
29508
  finally in L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags>,
29424
29509
  but this order may be changed by setting the PREFERRED level of the
@@ -29469,7 +29554,7 @@ the original size by padding with nulls if necessary.
29469
29554
 
29470
29555
  See
29471
29556
  L<https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/>
29472
- for the official specification.
29557
+ for the official QuickTime specification.
29473
29558
 
29474
29559
  Tag ID Tag Name Writable
29475
29560
  ------ -------- --------
@@ -29541,6 +29626,7 @@ currently reads 74 different formats of timed GPS metadata from video files.
29541
29626
  CameraModel no
29542
29627
  Car no
29543
29628
  DateTimeOriginal no
29629
+ DateTimeStamp no
29544
29630
  Distance no
29545
29631
  ExposureCompensation no
29546
29632
  ExposureTime no
@@ -30738,6 +30824,7 @@ the config file.
30738
30824
  'RDTC' RicohRDTC Ricoh RDTC
30739
30825
  'RDTG' RicohRDTG Ricoh RDTG
30740
30826
  'RDTL' RicohRDTL Ricoh RDTL
30827
+ 'RICO' RicohInfo JPEG
30741
30828
  'RMKN' RicohRMKN EXIF
30742
30829
  'RTHU' PreviewImage no
30743
30830
  'SDLN' PlayMode string
@@ -32650,7 +32737,8 @@ Other tags are extracted with the Unknown option.
32650
32737
 
32651
32738
  The following tags are extracted from Matroska multimedia container files.
32652
32739
  This container format is used by file types such as MKA, MKV, MKS and WEBM.
32653
- For speed, by default ExifTool extracts tags only up to the first Cluster.
32740
+ For speed, by default ExifTool extracts tags only up to the first Cluster
32741
+ unless a Seek element specifies the position of a Tags element after this.
32654
32742
  However, the Verbose (-v) and Unknown = 2 (-U) options force processing of
32655
32743
  Cluster data, and the ExtractEmbedded (-ee) option skips over Clusters to
32656
32744
  read subsequent tags. See
@@ -40063,6 +40151,7 @@ FileName.
40063
40151
  GeolocationCountryCode ExifTool no
40064
40152
  GeolocationDistance ExifTool no
40065
40153
  GeolocationFeatureCode ExifTool no
40154
+ GeolocationFeatureType ExifTool no
40066
40155
  GeolocationPopulation ExifTool no
40067
40156
  GeolocationPosition ExifTool no
40068
40157
  GeolocationRegion ExifTool no
@@ -40097,6 +40186,7 @@ FileName.
40097
40186
  PreviewTIFF File no
40098
40187
  PreviewWMF File no
40099
40188
  ProcessingTime ExifTool no
40189
+ RAFCompression File no
40100
40190
  RAFVersion File no
40101
40191
  ResourceForkSize System no
40102
40192
  SphericalVideoXML GSpherical yes!
@@ -215,7 +215,7 @@ sub FormatIPTC($$$$$;$)
215
215
  sub IptcDate($)
216
216
  {
217
217
  my $val = shift;
218
- unless ($val =~ s{^.*(\d{4})[-:/.]?(\d{2})[-:/.]?(\d{2}).*}{$1$2$3}s) {
218
+ unless ($val =~ s{^.*?(\d{4})[-:/.]?(\d{2})[-:/.]?(\d{2}).*}{$1$2$3}s) {
219
219
  warn "Invalid date format (use YYYY:mm:dd)\n";
220
220
  undef $val;
221
221
  }
@@ -507,10 +507,16 @@ sub WriteItemInfo($$$)
507
507
  my ($warn, $extent, $buff, @edit);
508
508
  $warn = 'Missing iloc box' unless $$boxPos{iloc};
509
509
  $warn = "No Extents for $type item" unless $$item{Extents} and @{$$item{Extents}};
510
- $warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding};
510
+ if ($$item{ContentEncoding}) {
511
+ if ($$item{ContentEncoding} ne 'deflate') {
512
+ $warn = "Can't currently decode $$item{ContentEncoding} encoded $type metadata";
513
+ } elsif (not eval { require Compress::Zlib }) {
514
+ $warn = "Install Compress::Zlib to decode deflated $type metadata";
515
+ }
516
+ }
511
517
  $warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
512
518
  $warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod};
513
- $warn = "$type metadata is not this file" if $$item{DataReferenceIndex};
519
+ $warn = "$type metadata is not in this file" if $$item{DataReferenceIndex};
514
520
  $warn and $et->Warn($warn), next;
515
521
  my $base = $$item{BaseOffset} || 0;
516
522
  my $val = '';
@@ -527,6 +533,25 @@ sub WriteItemInfo($$$)
527
533
  }
528
534
  next unless defined $buff;
529
535
  $buff = $val . $buff if length $val;
536
+ my $comp = $et->Options('Compress');
537
+ if (defined $comp and ($comp xor $$item{ContentEncoding})) {
538
+ #TODO: add ability to edit infe entry in iinf to change encoding according to Compress option if set
539
+ $et->Warn("Can't currently change compression when rewriting $name in HEIC");
540
+ }
541
+ my $wasDeflated;
542
+ if ($$item{ContentEncoding}) {
543
+ my ($v2, $stat);
544
+ my $inflate = Compress::Zlib::inflateInit();
545
+ $inflate and ($v2, $stat) = $inflate->inflate($buff);
546
+ $et->VPrint(0, " (Inflating stored $name metadata)\n");
547
+ if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
548
+ $buff = $v2;
549
+ $wasDeflated = 1;
550
+ } else {
551
+ $et->WarnOnce("Error inflating $name metadata");
552
+ next;
553
+ }
554
+ }
530
555
  my ($hdr, $subTable, $proc);
531
556
  if ($name eq 'EXIF') {
532
557
  if (not length $buff) {
@@ -560,6 +585,17 @@ sub WriteItemInfo($$$)
560
585
  ($dirInfo{DirLen} or length $newVal))
561
586
  {
562
587
  $newVal = $hdr . $newVal if length $hdr and length $newVal;
588
+ if ($wasDeflated) {
589
+ my $deflate = Compress::Zlib::deflateInit();
590
+ if ($deflate) {
591
+ $et->VPrint(0, " (Re-deflating new $name metadata)\n");
592
+ $buff = $deflate->deflate($newVal);
593
+ if (defined $buff) {
594
+ $buff .= $deflate->flush();
595
+ $newVal = $buff;
596
+ }
597
+ }
598
+ }
563
599
  $edit[0][2] = \$newVal; # replace the old chunk with the new data
564
600
  $edit[0][3] = $id; # mark this chunk with the item ID
565
601
  push @mdatEdit, @edit;
@@ -640,21 +676,38 @@ sub WriteItemInfo($$$)
640
676
  # add new infe to iinf
641
677
  $add{iinf} = $add{iref} = $add{iloc} = '' unless defined $add{iinf};
642
678
  my ($type, $mime);
679
+ my $enc = '';
643
680
  if ($name eq 'XMP') {
644
681
  $type = "mime\0";
645
682
  $mime = "application/rdf+xml\0";
683
+ # write compressed XMP if Compress option is set
684
+ if ($et->Options('Compress') and length $newVal) {
685
+ if (not eval { require Compress::Zlib }) {
686
+ $et->WarnOnce('Install Compress::Zlib to write compressed metadata');
687
+ } else {
688
+ my $deflate = Compress::Zlib::deflateInit();
689
+ if ($deflate) {
690
+ $et->VPrint(0, " (Deflating new $name metadata)\n");
691
+ my $buff = $deflate->deflate($newVal);
692
+ if (defined $buff) {
693
+ $newVal = $buff . $deflate->flush();
694
+ $enc = "deflate\0";
695
+ }
696
+ }
697
+ }
698
+ }
646
699
  } else {
647
700
  $type = "Exif\0";
648
701
  $mime = '';
649
702
  }
650
703
  my $id = 1;
651
704
  ++$id while $$items{$id} or $usedID{$id}; # find next unused item ID
652
- my $n = length($type) + length($mime) + 16;
705
+ my $n = length($type) + length($mime) + length($enc) + 16;
653
706
  if ($id < 0x10000) {
654
- $add{iinf} .= pack('Na4CCCCnn', $n, 'infe', 2, 0, 0, 1, $id, 0) . $type . $mime;
707
+ $add{iinf} .= pack('Na4CCCCnn', $n, 'infe', 2, 0, 0, 1, $id, 0) . $type . $mime . $enc;
655
708
  } else {
656
709
  $n += 2;
657
- $add{iinf} .= pack('Na4CCCCNn', $n, 'infe', 3, 0, 0, 1, $id, 0) . $type . $mime;
710
+ $add{iinf} .= pack('Na4CCCCNn', $n, 'infe', 3, 0, 0, 1, $id, 0) . $type . $mime . $enc;
658
711
  }
659
712
  # add new cdsc to iref
660
713
  if ($irefVer) {
@@ -733,28 +786,36 @@ sub WriteItemInfo($$$)
733
786
  $add{$tag} = Set32u(12 + length $add{$tag}) . $tag .
734
787
  Set8u($$boxPos{$tag}[2]) . "\0\0\0" . $add{$tag};
735
788
  } elsif ($tag ne 'hdlr') {
736
- my $n = Get32u($outfile, $pos);
737
- Set32u($n + length($add{$tag}), $outfile, $pos); # increase box size
789
+ my $n = Get32u($outfile, $pos) + length($add{$tag});
790
+ Set32u($n, $outfile, $pos); # increase box size
738
791
  }
739
792
  if ($tag eq 'iinf') {
740
793
  my $iinfVer = Get8u($outfile, $pos + 8);
741
794
  if ($iinfVer == 0) {
742
- my $n = Get16u($outfile, $pos + 12);
743
- Set16u($n + $countNew, $outfile, $pos + 12); # incr count
795
+ my $n = Get16u($outfile, $pos + 12) + $countNew;
796
+ if ($n > 0xffff) {
797
+ $et->Error("Can't currently handle rollover to long item count");
798
+ return undef;
799
+ }
800
+ Set16u($n, $outfile, $pos + 12); # incr count
744
801
  } else {
745
- my $n = Get32u($outfile, $pos + 12);
746
- Set32u($n + $countNew, $outfile, $pos + 12); # incr count
802
+ my $n = Get32u($outfile, $pos + 12) + $countNew;
803
+ Set32u($n, $outfile, $pos + 12); # incr count
747
804
  }
748
805
  } elsif ($tag eq 'iref') {
749
806
  # nothing more to do
750
807
  } elsif ($tag eq 'iloc') {
751
808
  my $ilocVer = Get8u($outfile, $pos + 8);
752
809
  if ($ilocVer < 2) {
753
- my $n = Get16u($outfile, $pos + 14);
754
- Set16u($n + $countNew, $outfile, $pos + 14); # incr count
810
+ my $n = Get16u($outfile, $pos + 14) + $countNew;
811
+ Set16u($n, $outfile, $pos + 14); # incr count
812
+ if ($n > 0xffff) {
813
+ $et->Error("Can't currently handle rollover to long item count");
814
+ return undef;
815
+ }
755
816
  } else {
756
- my $n = Get32u($outfile, $pos + 14);
757
- Set32u($n + $countNew, $outfile, $pos + 14); # incr count
817
+ my $n = Get32u($outfile, $pos + 14) + $countNew;
818
+ Set32u($n, $outfile, $pos + 14); # incr count
758
819
  }
759
820
  # must also update pointer locations in this box
760
821
  if ($added) {
@@ -876,7 +937,8 @@ sub WriteQuickTime($$$)
876
937
  # --> hold this terminator to the end
877
938
  $term = $hdr;
878
939
  } elsif ($n != 0) {
879
- $et->Error("Unknown $n bytes at end of file", 1);
940
+ # warn unless this is 1-3 pad bytes
941
+ $et->Error("Unknown $n bytes at end of file", 1) if $n > 3 or $hdr ne "\0" x $n;
880
942
  }
881
943
  last;
882
944
  }
@@ -894,6 +956,8 @@ sub WriteQuickTime($$$)
894
956
  } elsif (not $et->Options('LargeFileSupport')) {
895
957
  $et->Error('End of processing at large atom (LargeFileSupport not enabled)');
896
958
  last;
959
+ } elsif ($et->Options('LargeFileSupport') eq '2') {
960
+ $et->WarnOnce('Processing large atom (LargeFileSupport is 2)');
897
961
  }
898
962
  }
899
963
  $size = $hi * 4294967296 + $lo - 16;
@@ -1446,7 +1510,13 @@ sub WriteQuickTime($$$)
1446
1510
  $writeLast = ($writeLast || '') . $hdr . $buff;
1447
1511
  } else {
1448
1512
  # save position of this box in the output buffer
1513
+ #TODO do this:
1514
+ #TODO my $bp = $boxPos{$tag} || ($boxPos{$tag} = [ ]);
1515
+ #TODO push @$bp, length($$outfile), length($hdr) + length($buff);
1516
+ #TODO instead of this:
1449
1517
  $boxPos{$tag} = [ length($$outfile), length($hdr) + length($buff) ];
1518
+ #TODO then we have the positions of all the infe boxes -- we then only need
1519
+ #TODO to know the index of the box to edit if the encoding changes for one of them
1450
1520
  # copy the existing atom
1451
1521
  Write($outfile, $hdr, $buff) or $rtnVal=$rtnErr, $err=1, last;
1452
1522
  }
@@ -29,7 +29,6 @@ sub ConvInv($$$$$;$$);
29
29
  sub PushValue($$$;$);
30
30
 
31
31
  my $loadedAllTables; # flag indicating we loaded all tables
32
- my $advFmtSelf; # ExifTool object during evaluation of advanced formatting expr
33
32
 
34
33
  # the following is a road map of where we write each directory
35
34
  # in the different types of files.
@@ -3380,7 +3379,7 @@ sub InsertTagValues($$;$$$$)
3380
3379
  if (defined $expr and defined $val) {
3381
3380
  local $SIG{'__WARN__'} = \&SetWarning;
3382
3381
  undef $evalWarning;
3383
- $advFmtSelf = $self;
3382
+ $advFmtSelf = $self; # set variable for access to $self in helper functions
3384
3383
  if ($asList) {
3385
3384
  foreach (@val) {
3386
3385
  #### eval advanced formatting expression ($_, $self, @val, $tag, $advFmtSelf)
@@ -3845,7 +3844,6 @@ sub GetGeolocateTags($$;$)
3845
3844
  'iptc' => [ qw(City Province-State Country-PrimaryLocationCode Country-PrimaryLocationName) ],
3846
3845
  'gps' => [ qw(GPSLatitude GPSLongitude GPSLatitudeRef GPSLongitudeRef) ],
3847
3846
  'xmp-exif' => [ qw(GPSLatitude GPSLongitude) ],
3848
- 'keys' => [ 'GPSCoordinates', 'LocationName' ],
3849
3847
  'itemlist' => [ 'GPSCoordinates' ],
3850
3848
  'userdata' => [ 'GPSCoordinates' ],
3851
3849
  # more general groups not in this lookup: XMP and QuickTime
@@ -3856,12 +3854,16 @@ sub GetGeolocateTags($$;$)
3856
3854
  $tagGroups{$grp} and push @tags, map("$grp:$_", @{$tagGroups{$grp}});
3857
3855
  }
3858
3856
  # set default XMP City tags if necessary
3859
- if (not $writeGPS and ($grps{xmp} or (not @tags and not $grps{quicktime}))) {
3860
- push @tags, qw(XMP:City XMP:State XMP:CountryCode XMP:Country Keys:LocationName);
3857
+ if (not $writeGPS) {
3858
+ push @tags, 'Keys:LocationName' if $grps{'keys'};
3859
+ if ($grps{xmp} or (not @tags and not $grps{quicktime})) {
3860
+ push @tags, qw(XMP:City XMP:State XMP:CountryCode XMP:Country Keys:LocationName);
3861
+ }
3861
3862
  }
3862
3863
  $writeGPS = 1 unless defined $writeGPS; # (delete both City and GPS)
3864
+ push @tags, 'Keys:GPSCoordinates' if $writeGPS and $grps{'keys'};
3863
3865
  # set default QuickTime tag if necessary
3864
- my $didQT = grep /Coordinates$/, @tags;
3866
+ my $didQT = grep /GPSCoordinates$/, @tags;
3865
3867
  if (($grps{quicktime} and not $didQT) or ($writeGPS and not @tags and not $grps{xmp})) {
3866
3868
  push @tags, 'QuickTime:GPSCoordinates';
3867
3869
  }
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.65';
53
+ $VERSION = '3.66';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -203,8 +203,9 @@ my %xmpNS = (
203
203
  hdr_metadata => 'http://ns.adobe.com/hdr-metadata/1.0/',
204
204
  hdrgm => 'http://ns.adobe.com/hdr-gain-map/1.0/',
205
205
  xmpDSA => 'http://leica-camera.com/digital-shift-assistant/1.0/',
206
- # Note: Not included due to namespace prefix conflict with Device:Container
207
- # Container => 'http://ns.google.com/photos/1.0/container/',
206
+ # Note: Google uses a prefix of 'Container', but this conflicts with the
207
+ # Device Container namespace, also by Google. So call this one GContainer
208
+ GContainer=> 'http://ns.google.com/photos/1.0/container/',
208
209
  );
209
210
 
210
211
  # build reverse namespace lookup
@@ -932,11 +933,10 @@ my %sRangeMask = (
932
933
  Name => 'xmpDSA',
933
934
  SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::DSA' },
934
935
  },
935
- # Note: Note included due to namespace prefix conflict with Device:Container
936
- # Container => {
937
- # Name => 'Container',
938
- # SubDirectory => { TagTable => 'Image::ExifTool::XMP::Container' },
939
- # },
936
+ GContainer => {
937
+ Name => 'GContainer',
938
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::GContainer' },
939
+ },
940
940
  );
941
941
 
942
942
  # hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm)
@@ -3794,6 +3794,8 @@ sub ParseXMPElement($$$;$$$$)
3794
3794
  if ($stdNS) {
3795
3795
  $val = $try;
3796
3796
  $et->WarnOnce("Fixed incorrect URI for xmlns:$ns", 1);
3797
+ } elsif ($val =~ m(^http://ns.nikon.com/BASIC_PARAM)) {
3798
+ $et->OverrideFileType('NXD','application/x-nikon-nxd');
3797
3799
  } else {
3798
3800
  # look for same namespace with different version number
3799
3801
  $try = quotemeta $val; # (note: escapes slashes too)