exiftool-vendored.pl 13.25.1 → 13.29.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 (39) hide show
  1. package/README.md +10 -2
  2. package/bin/Changes +56 -3
  3. package/bin/META.json +3 -2
  4. package/bin/META.yml +3 -2
  5. package/bin/README +3 -3
  6. package/bin/arg_files/exif2xmp.args +2 -1
  7. package/bin/arg_files/xmp2exif.args +2 -1
  8. package/bin/build_geolocation +1 -1
  9. package/bin/exiftool +17 -15
  10. package/bin/lib/Image/ExifTool/Canon.pm +5 -4
  11. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  12. package/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -0
  13. package/bin/lib/Image/ExifTool/JPEG.pm +20 -8
  14. package/bin/lib/Image/ExifTool/LigoGPS.pm +16 -2
  15. package/bin/lib/Image/ExifTool/MPF.pm +5 -1
  16. package/bin/lib/Image/ExifTool/Nikon.pm +2 -1
  17. package/bin/lib/Image/ExifTool/Olympus.pm +3 -2
  18. package/bin/lib/Image/ExifTool/PCAP.pm +5 -5
  19. package/bin/lib/Image/ExifTool/Panasonic.pm +9 -1
  20. package/bin/lib/Image/ExifTool/Parrot.pm +54 -7
  21. package/bin/lib/Image/ExifTool/Pentax.pm +102 -1
  22. package/bin/lib/Image/ExifTool/Plot.pm +36 -15
  23. package/bin/lib/Image/ExifTool/QuickTime.pm +78 -12
  24. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +70 -14
  25. package/bin/lib/Image/ExifTool/README +12 -2
  26. package/bin/lib/Image/ExifTool/RIFF.pm +15 -6
  27. package/bin/lib/Image/ExifTool/Sony.pm +5 -0
  28. package/bin/lib/Image/ExifTool/TagLookup.pm +23 -2
  29. package/bin/lib/Image/ExifTool/TagNames.pod +149 -92
  30. package/bin/lib/Image/ExifTool/WriteExif.pl +2 -0
  31. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +3 -0
  32. package/bin/lib/Image/ExifTool/Writer.pl +17 -6
  33. package/bin/lib/Image/ExifTool/XMP.pm +23 -16
  34. package/bin/lib/Image/ExifTool/XMP2.pl +5 -1
  35. package/bin/lib/Image/ExifTool.pm +7 -3
  36. package/bin/lib/Image/ExifTool.pod +13 -12
  37. package/bin/perl-Image-ExifTool.spec +1 -1
  38. package/bin/windows_exiftool.txt +6 -5
  39. package/package.json +12 -9
@@ -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 28422 tags, with 17656 unique tag names.
15
+ They contain a total of 28445 tags, with 17669 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
@@ -154,7 +154,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
154
154
  InfiRaySensor InfiRay Sensor
155
155
  SEAL XMP SEAL
156
156
  'APP10' Comment no
157
- HDRGainCurve no
157
+ HDRGainInfo -
158
158
  'APP11' JPEG-HDR JPEG HDR
159
159
  JUMBF Jpeg2000
160
160
  'APP12' PictureInfo APP12 PictureInfo
@@ -171,6 +171,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
171
171
  FotoStation FotoStation
172
172
  PhotoMechanic PhotoMechanic
173
173
  MIE MIE
174
+ MPF MPF
174
175
  Samsung Samsung Trailer
175
176
  Vivo Trailer Vivo
176
177
  OnePlus Trailer OnePlus
@@ -277,6 +278,13 @@ Tags found in the XML metadata of the APP9 "Media Jukebox" segment.
277
278
  Tool_Name no
278
279
  Tool_Version no
279
280
 
281
+ =head3 JPEG HDRGainInfo Tags
282
+
283
+ Index1 Tag Name Writable
284
+ ------ -------- --------
285
+ 6 HDRGainCurveSize no
286
+ 10 HDRGainCurve no
287
+
280
288
  =head3 JPEG HDR Tags
281
289
 
282
290
  Information extracted from APP11 of a JPEG-HDR image.
@@ -6366,7 +6374,9 @@ These tags belong to the ExifTool XMP-xmpBJ family 1 group.
6366
6374
 
6367
6375
  =head3 XMP xmpDM Tags
6368
6376
 
6369
- XMP Dynamic Media namespace tags.
6377
+ XMP Dynamic Media namespace tags. See
6378
+ L<https://developer.adobe.com/xmp/docs/XMPNamespaces/xmpDM/> for the
6379
+ specification.
6370
6380
 
6371
6381
  These tags belong to the ExifTool XMP-xmpDM family 1 group.
6372
6382
 
@@ -19901,6 +19911,7 @@ These tags are used in Panasonic/Leica cameras.
19901
19911
  0x00d1 ISO int32u
19902
19912
  0x00d2 MonochromeGrainEffect int16u
19903
19913
  0x00d6 NoiseReductionStrength rational64s
19914
+ 0x00de AFAreaSize rational64u[2]
19904
19915
  0x00e4 LensTypeModel int16u
19905
19916
  0x00e8 MinimumISO int32u
19906
19917
  0x00e9 AFSubjectDetection int16u
@@ -20664,6 +20675,9 @@ Flash information tags for the K10D, K20D and K200D.
20664
20675
  6 AFDefocus int8u
20665
20676
  7 AFIntegrationTime int8u
20666
20677
  11 AFPointsInFocus int8u
20678
+ 20 AFPointValues? no
20679
+ 298 AFPointsSelected int8u[41]~
20680
+ 399 AFPointsUnknown? int8u[41]~
20667
20681
  506 LiveView int8u
20668
20682
  509 AFHold int8u
20669
20683
 
@@ -20900,6 +20914,7 @@ sensors are located in the camera.
20900
20914
  14 SensorTemperature2 int16s
20901
20915
  20 CameraTemperature4 int16s
20902
20916
  22 CameraTemperature5 int16s
20917
+ 42 SensorTemperature int16s
20903
20918
 
20904
20919
  =head3 Pentax UnknownInfo Tags
20905
20920
 
@@ -30308,6 +30323,7 @@ for the official QuickTime specification.
30308
30323
  'gdat' GPSData QuickTime Stream
30309
30324
  'gps0' GPSTrack QuickTime Stream
30310
30325
  'gsen' GSensor QuickTime Stream
30326
+ 'inst' Insta360Info QuickTime Stream
30311
30327
  'junk' Junk? no
30312
30328
  'mdat' MediaData? no
30313
30329
  'mdat-offset' MediaDataOffset no
@@ -30316,7 +30332,7 @@ for the official QuickTime specification.
30316
30332
  'meta' Meta QuickTime Meta
30317
30333
  'moof' MovieFragment QuickTime MovieFragment
30318
30334
  'moov' Movie QuickTime Movie
30319
- 'mpvd' MotionPhotoVideo yes
30335
+ 'mpvd' MotionPhotoVideo undef
30320
30336
  'nbmt' NextbaseMeta QuickTime Stream
30321
30337
  'pict' PreviewPICT no
30322
30338
  'pnot' Preview QuickTime Preview
@@ -30332,6 +30348,7 @@ for the official QuickTime specification.
30332
30348
  'udat' GPSLog no
30333
30349
  'udta' KenwoodData QuickTime Stream
30334
30350
  LigoJSON QuickTime Stream
30351
+ GKUData QuickTime Stream
30335
30352
  FLIRData FLIR UserData
30336
30353
  'uuid' XMP XMP
30337
30354
  UUID-PROF QuickTime Profile
@@ -30351,81 +30368,83 @@ for the official QuickTime specification.
30351
30368
  The tags below are extracted from timed metadata in QuickTime and other
30352
30369
  formats of video files when the ExtractEmbedded option is used. Although
30353
30370
  most of these tags are combined into the single table below, ExifTool
30354
- currently reads 103 different types of timed GPS metadata from video files.
30371
+ currently reads 107 different types of timed GPS metadata from video files.
30355
30372
 
30356
- Tag Name Writable
30357
- -------- --------
30358
- Accelerometer no
30359
- AccelerometerData no
30360
- AngularVelocity no
30361
- CTMD Canon CTMD
30362
- CameraDateTime no
30363
- CameraModel no
30364
- Car no
30365
- DJIDebug? DJI Protobuf
30366
- DJIMetadata DJI Protobuf
30367
- DateTimeOriginal no
30368
- DateTimeStamp no
30369
- Distance no
30370
- ExposureCompensation no
30371
- ExposureTime no
30372
- FNumber no
30373
- FrameNumber no
30374
- GPSAltitude no
30375
- GPSDOP no
30376
- GPSDateTime no
30377
- GPSLatitude no
30378
- GPSLatitude2 no
30379
- GPSLongitude no
30380
- GPSLongitude2 no
30381
- GPSSatellites no
30382
- GPSSpeed no
30383
- GPSSpeedRef no
30384
- GPSTimeStamp no
30385
- GPSTrack no
30386
- GPSTrackRef no
30387
- GSensor no
30388
- INSV QuickTime INSV_MakerNotes
30389
- ISO no
30390
- JpgFromRaw no
30391
- KiloCalories no
30392
- MagneticVariation no
30393
- PreviewImage no
30394
- PreviewInfo QuickTime PreviewInfo
30395
- RVMI_gReV QuickTime RVMI_gReV
30396
- RVMI_sReV QuickTime RVMI_sReV
30397
- RawGSensor no
30398
- SampleDateTime no
30399
- SampleDuration no
30400
- SampleTime no
30401
- Text no
30402
- TimeCode no
30403
- Unknown00? no
30404
- Unknown01? no
30405
- Unknown02? no
30406
- Unknown03? no
30407
- UserLabel no
30408
- VerticalSpeed no
30409
- VideoTimeStamp no
30410
- camm0 QuickTime camm0
30411
- camm1 QuickTime camm1
30412
- camm2 QuickTime camm2
30413
- camm3 QuickTime camm3
30414
- camm4 QuickTime camm4
30415
- camm5 QuickTime camm5
30416
- camm6 QuickTime camm6
30417
- camm7 QuickTime camm7
30418
- fdsc GoPro fdsc
30419
- gpmd_Kingslim QuickTime Stream
30420
- gpmd_Rove QuickTime Stream
30421
- gpmd_FMAS QuickTime Stream
30422
- gpmd_Wolfbox QuickTime Stream
30423
- gpmd_GoPro GoPro GPMF
30424
- marl GM marl
30425
- mebx QuickTime Keys
30426
- mett Parrot mett
30427
- rtmd Sony rtmd
30428
- tx3g QuickTime tx3g
30373
+ Tag ID Tag Name Writable
30374
+ ------ -------- --------
30375
+ 'Accelerometer' Accelerometer no
30376
+ 'AccelerometerData' AccelerometerData no
30377
+ 'AngularVelocity' AngularVelocity no
30378
+ 'CTMD' CTMD Canon CTMD
30379
+ 'CameraDateTime' CameraDateTime no
30380
+ 'CameraModel' CameraModel no
30381
+ 'Car' Car no
30382
+ 'DateTimeOriginal' DateTimeOriginal no
30383
+ 'DateTimeStamp' DateTimeStamp no
30384
+ 'Distance' Distance no
30385
+ 'ExposureCompensation' ExposureCompensation no
30386
+ 'ExposureTime' ExposureTime no
30387
+ 'FNumber' FNumber no
30388
+ 'FrameNumber' FrameNumber no
30389
+ 'GPSAltitude' GPSAltitude no
30390
+ 'GPSDOP' GPSDOP no
30391
+ 'GPSDateTime' GPSDateTime no
30392
+ 'GPSLatitude' GPSLatitude no
30393
+ 'GPSLatitude2' GPSLatitude2 no
30394
+ 'GPSLongitude' GPSLongitude no
30395
+ 'GPSLongitude2' GPSLongitude2 no
30396
+ 'GPSSatellites' GPSSatellites no
30397
+ 'GPSSpeed' GPSSpeed no
30398
+ 'GPSSpeedRef' GPSSpeedRef no
30399
+ 'GPSTimeStamp' GPSTimeStamp no
30400
+ 'GPSTrack' GPSTrack no
30401
+ 'GPSTrackRef' GPSTrackRef no
30402
+ 'GSensor' GSensor no
30403
+ 'INSV' INSV QuickTime INSV_MakerNotes
30404
+ 'ISO' ISO no
30405
+ 'JPEG' JpgFromRaw no
30406
+ 'KiloCalories' KiloCalories no
30407
+ 'MagneticVariation' MagneticVariation no
30408
+ 'RVMI' RVMI_gReV QuickTime RVMI_gReV
30409
+ RVMI_sReV QuickTime RVMI_sReV
30410
+ 'RawGSensor' RawGSensor no
30411
+ 'SampleDateTime' SampleDateTime no
30412
+ 'SampleDuration' SampleDuration no
30413
+ 'SampleTime' SampleTime no
30414
+ 'Text' Text no
30415
+ 'TimeCode' TimeCode no
30416
+ 'Unknown00' Unknown00? no
30417
+ 'Unknown01' Unknown01? no
30418
+ 'Unknown02' Unknown02? no
30419
+ 'Unknown03' Unknown03? no
30420
+ 'UserLabel' UserLabel no
30421
+ 'VerticalSpeed' VerticalSpeed no
30422
+ 'VideoTimeStamp' VideoTimeStamp no
30423
+ 'camm' camm0 QuickTime camm0
30424
+ camm1 QuickTime camm1
30425
+ camm2 QuickTime camm2
30426
+ camm3 QuickTime camm3
30427
+ camm4 QuickTime camm4
30428
+ camm5 QuickTime camm5
30429
+ camm6 QuickTime camm6
30430
+ camm7 QuickTime camm7
30431
+ 'dbgi' DJIDebug? DJI Protobuf
30432
+ 'djmd' DJIMetadata DJI Protobuf
30433
+ 'fdsc' fdsc GoPro fdsc
30434
+ 'gpmd' gpmd_Kingslim QuickTime Stream
30435
+ gpmd_Rove QuickTime Stream
30436
+ gpmd_FMAS QuickTime Stream
30437
+ gpmd_Wolfbox QuickTime Stream
30438
+ gpmd_GoPro GoPro GPMF
30439
+ 'marl' marl GM marl
30440
+ 'mebx' mebx QuickTime Keys
30441
+ 'mett' mett Parrot mett
30442
+ 'rtmd' rtmd Sony rtmd
30443
+ 'ssmd' RoveGPS QuickTime RoveGPS
30444
+ Accelerometer no
30445
+ PreviewImage no
30446
+ 'text' PreviewInfo QuickTime PreviewInfo
30447
+ 'tx3g' tx3g QuickTime tx3g
30429
30448
 
30430
30449
  =head3 QuickTime INSV_MakerNotes Tags
30431
30450
 
@@ -30436,14 +30455,6 @@ currently reads 103 different types of timed GPS metadata from video files.
30436
30455
  0x001a Firmware no
30437
30456
  0x002a Parameters no
30438
30457
 
30439
- =head3 QuickTime PreviewInfo Tags
30440
-
30441
- Preview stored by TomTom Bandit ActionCam.
30442
-
30443
- Index1 Tag Name Writable
30444
- ------ -------- --------
30445
- 8 PreviewImage no
30446
-
30447
30458
  =head3 QuickTime RVMI_gReV Tags
30448
30459
 
30449
30460
  GPS information extracted from the RVMI box of MOV videos.
@@ -30668,6 +30679,23 @@ VideoKeys family 1 gorup.
30668
30679
  ------ -------- --------
30669
30680
  'cits' FaceItem QuickTime Keys
30670
30681
 
30682
+ =head3 QuickTime RoveGPS Tags
30683
+
30684
+ Index1 Tag Name Writable
30685
+ ------ -------- --------
30686
+ 0 GPSLatitude no
30687
+ 8 GPSLongitude no
30688
+ 20 GPSSpeed no
30689
+ 22 GPSDateTime no
30690
+
30691
+ =head3 QuickTime PreviewInfo Tags
30692
+
30693
+ Preview stored by TomTom Bandit ActionCam.
30694
+
30695
+ Index1 Tag Name Writable
30696
+ ------ -------- --------
30697
+ 8 PreviewImage no
30698
+
30671
30699
  =head3 QuickTime tx3g Tags
30672
30700
 
30673
30701
  Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
@@ -31157,6 +31185,7 @@ MP4 media box.
31157
31185
 
31158
31186
  Tag ID Tag Name Writable
31159
31187
  ------ -------- --------
31188
+ 'elng' ExtendedLanguageTag no
31160
31189
  'hdlr' Handler QuickTime Handler
31161
31190
  'mdhd' MediaHeader QuickTime MediaHeader
31162
31191
  'minf' MediaInfo QuickTime MediaInfo
@@ -31556,8 +31585,15 @@ MP4 video media header.
31556
31585
  ------ -------- --------
31557
31586
  'cdsc' ContentDescribes no
31558
31587
  'chap' ChapterListTrackID no
31588
+ 'clcp' ClosedCaptionTrack no
31589
+ 'fall' AlternateFormatTrack no
31590
+ 'folw' SubtitleTrack no
31591
+ 'forc' ForcedSubtitleTrack no
31559
31592
  'mpod' ElementaryStreamTrack no
31560
- 'tmcd' TimeCode no
31593
+ 'scpt' TranscriptTrack no
31594
+ 'ssrc' Non-primarySourceTrack no
31595
+ 'sync' SyncronizedTrack no
31596
+ 'tmcd' TimecodeTrack no
31561
31597
 
31562
31598
  =head3 QuickTime UserData Tags
31563
31599
 
@@ -31682,6 +31718,7 @@ the config file.
31682
31718
  'mcvr' PreviewImage string
31683
31719
  'meta' Meta QuickTime Meta
31684
31720
  'modl' Model no
31721
+ 'nail' ThumbnailTIFF no
31685
31722
  'name' Name string
31686
31723
  'perf' Performer string/
31687
31724
  'pmcc' GarminSettings string
@@ -31705,6 +31742,7 @@ the config file.
31705
31742
  UnknownThumbnail string
31706
31743
  'time' TimeStamp no
31707
31744
  'titl' Title string/
31745
+ 'tnam' TrackName string
31708
31746
  'urat' UserRating undef/
31709
31747
  'uuid' GarminSoftware string
31710
31748
  GarminModel no
@@ -32120,6 +32158,7 @@ metadata to WEBP images, but can't yet write to other RIFF-based formats.
32120
32158
  'EXIF' EXIF EXIF
32121
32159
  UnknownEXIF no
32122
32160
  'ICCP' ICC_Profile ICC_Profile
32161
+ 'ID3 ' ID3-2 ID3
32123
32162
  'IDIT' DateTimeOriginal no
32124
32163
  'JUNK' OlympusJunk Olympus AVI
32125
32164
  CasioJunk EXIF
@@ -32748,9 +32787,11 @@ specification.
32748
32787
  'E2' ParrotFollowMe Parrot FollowMe
32749
32788
  'E3' ParrotAutomation Parrot Automation
32750
32789
  'application/arcore-accel' ARCoreAccel Parrot ARCoreAccel
32790
+ 'application/arcore-accel-0' ARCoreAccel0 Parrot ARCoreAccel0
32751
32791
  'application/arcore-custom-event'
32752
32792
  ARCoreCustom Parrot ARCoreCustom
32753
32793
  'application/arcore-gyro' ARCoreGyro Parrot ARCoreGyro
32794
+ 'application/arcore-gyro-0' ARCoreGyro0 Parrot ARCoreGyro0
32754
32795
  'application/arcore-video-0' ARCoreVideo Parrot ARCoreVideo
32755
32796
 
32756
32797
  =head3 Parrot V1 Tags
@@ -32888,6 +32929,14 @@ ARCore accelerometer data.
32888
32929
  4 AccelerometerUnknown? no
32889
32930
  5 Accelerometer no
32890
32931
 
32932
+ =head3 Parrot ARCoreAccel0 Tags
32933
+
32934
+ ARCore accelerometer data.
32935
+
32936
+ Index1 Tag Name Writable
32937
+ ------ -------- --------
32938
+ 9 Accelerometer no
32939
+
32891
32940
  =head3 Parrot ARCoreCustom Tags
32892
32941
 
32893
32942
  Index1 Tag Name Writable
@@ -32896,13 +32945,21 @@ ARCore accelerometer data.
32896
32945
 
32897
32946
  =head3 Parrot ARCoreGyro Tags
32898
32947
 
32899
- ARCore accelerometer data.
32948
+ ARCore gyro data.
32900
32949
 
32901
32950
  Index1 Tag Name Writable
32902
32951
  ------ -------- --------
32903
32952
  4 GyroscopeUnknown? no
32904
32953
  5 Gyroscope no
32905
32954
 
32955
+ =head3 Parrot ARCoreGyro0 Tags
32956
+
32957
+ ARCore gyro data.
32958
+
32959
+ Index1 Tag Name Writable
32960
+ ------ -------- --------
32961
+ 9 Gyroscope no
32962
+
32906
32963
  =head3 Parrot ARCoreVideo Tags
32907
32964
 
32908
32965
  Index1 Tag Name Writable
@@ -40185,7 +40242,7 @@ Tags extracted from CAP, PCAP and PCAPNG Packet Capture files.
40185
40242
  0x0bac CustomOption1 no
40186
40243
  0x0bad CustomOption2 no
40187
40244
  0x4bac CustomOption3 no
40188
- 0x4bad CustomOption3 no
40245
+ 0x4bad CustomOption4 no
40189
40246
  'ByteOrder' ByteOrder no
40190
40247
  'IDB-2' DeviceName no
40191
40248
  'IDB-3' Description no
@@ -40197,8 +40254,8 @@ Tags extracted from CAP, PCAP and PCAPNG Packet Capture files.
40197
40254
  'IDB-9' TimeStampResolution no
40198
40255
  'IDB-10' TimeZone no
40199
40256
  'IDB-11' Filter no
40200
- 'IDB-12' OperatingSytem no
40201
- 'IDB-13' FCSLen no
40257
+ 'IDB-12' OperatingSystem no
40258
+ 'IDB-13' FrameCheckSequenceLength no
40202
40259
  'IDB-14' TimeStampOffset no
40203
40260
  'IDB-15' Hardware no
40204
40261
  'IDB-16' TXSpeed no
@@ -40207,7 +40264,7 @@ Tags extracted from CAP, PCAP and PCAPNG Packet Capture files.
40207
40264
  'LinkType' LinkType no
40208
40265
  'PCAPVersion' PCAPVersion no
40209
40266
  'SHB-2' Hardware no
40210
- 'SHB-3' OperatingSytem no
40267
+ 'SHB-3' OperatingSystem no
40211
40268
  'SHB-4' UserApplication no
40212
40269
  'TimeStamp' TimeStamp no
40213
40270
 
@@ -2434,6 +2434,8 @@ NoOverwrite: next if $isNew > 0;
2434
2434
  } else {
2435
2435
  my $fixedOffset = Get32u(\$newData, $offsets);
2436
2436
  my $padToFixedOffset = $fixedOffset - ($newOffset + $dpos);
2437
+ # account for blocks that come before this (Pansonic DC-S1RM2, forum17319)
2438
+ $padToFixedOffset -= $$_[1] + $$_[2] foreach @imageData;
2437
2439
  if ($padToFixedOffset < 0) {
2438
2440
  $et->Error('Metadata too large to fit before fixed-offset image data');
2439
2441
  } else {
@@ -1248,6 +1248,8 @@ ItemID2: foreach $id (reverse sort { $a <=> $b } keys %$items) {
1248
1248
  my $base = ($$dirInfo{Base} || 0) + $raf->Tell() - $size;
1249
1249
  my $dPos = 0;
1250
1250
  my $hdrLen = $start;
1251
+ # handle case where known trailer is the payload of a "DontRead" box (eg. 'inst')
1252
+ $trailer = $$trailer[3] if $$tagInfo{DontRead} and $trailer and $base == $$trailer[1];
1251
1253
  if ($$subdir{Base}) {
1252
1254
  my $localBase = eval $$subdir{Base};
1253
1255
  $dPos -= $localBase;
@@ -1729,6 +1731,7 @@ ItemID2: foreach $id (reverse sort { $a <=> $b } keys %$items) {
1729
1731
  # (note that $tag may be a binary Keys index here)
1730
1732
  foreach $tag (@addTags) {
1731
1733
  my $tagInfo = $$dirs{$tag} || $$newTags{$tag};
1734
+ next unless ref $tagInfo eq 'HASH'; # (shouldn't happen, but somehow there is forum17260)
1732
1735
  next if defined $$tagInfo{CanCreate} and not $$tagInfo{CanCreate};
1733
1736
  next if defined $$tagInfo{MediaType} and $$et{MediaType} ne $$tagInfo{MediaType};
1734
1737
  my $subdir = $$tagInfo{SubDirectory};
@@ -76,6 +76,8 @@ my %jpegMap = (
76
76
  MetaIFD => 'Meta',
77
77
  RMETA => 'APP5',
78
78
  SEAL => ['APP8','APP9'], # (note: add 'IFD0' if this is a possibility)
79
+ AROT => 'APP10',
80
+ JUMBF => 'APP11',
79
81
  Ducky => 'APP12',
80
82
  Photoshop => 'APP13',
81
83
  Adobe => 'APP14',
@@ -138,12 +140,12 @@ my %rawType = (
138
140
  # 2) any dependencies must be added to %excludeGroups
139
141
  my @delGroups = qw(
140
142
  Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11 APP12
141
- APP13 APP14 APP15 AudioKeys CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix
143
+ APP13 APP14 APP15 AROT AudioKeys CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix
142
144
  FotoStation GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC
143
- ItemList iTunes JFIF Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft
144
- MIE MPF Nextbase NikonApp NikonCapture PDF PDF-update PhotoMechanic
145
- Photoshop PNG PNG-pHYs PrintIM QuickTime RMETA RSRC SEAL SubIFD Trailer
146
- UserData VideoKeys Vivo XML XML-* XMP XMP-*
145
+ ItemList iTunes JFIF Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE
146
+ MPF Nextbase NikonApp NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG
147
+ PNG-pHYs PrintIM QuickTime RMETA RSRC SEAL SubIFD Trailer UserData VideoKeys
148
+ Vivo XML XML-* XMP XMP-*
147
149
  );
148
150
  # family 2 group names that we can delete
149
151
  my @delGroup2 = qw(
@@ -1604,6 +1606,8 @@ SET: foreach $set (@setList) {
1604
1606
  $$opts{Group} = $dstGrp if $dstGrp;
1605
1607
  my @rtnVals = $self->SetNewValue($dstTag, $val, %$opts);
1606
1608
  $rtnInfo{$dstTag} = $val if $rtnVals[0]; # tag was set successfully
1609
+ # return warning if any
1610
+ $rtnInfo{NextFreeTagKey(\%rtnInfo, 'Warning')} = $rtnVals[1] if $rtnVals[1];
1607
1611
  next;
1608
1612
  }
1609
1613
  foreach $tag (@{$setMatches{$set}}) {
@@ -5736,6 +5740,8 @@ sub WriteJPEG($$)
5736
5740
  $s =~ /^(Meta|META|Exif)\0\0/ and $dirName = 'Meta';
5737
5741
  } elsif ($marker == 0xe5) {
5738
5742
  $s =~ /^RMETA\0/ and $dirName = 'RMETA';
5743
+ } elsif ($marker == 0xea) {
5744
+ $s =~ /^AROT\0\0/ and $dirName = 'AROT';
5739
5745
  } elsif ($marker == 0xeb) {
5740
5746
  $s =~ /^JP/ and $dirName = 'JUMBF';
5741
5747
  } elsif ($marker == 0xec) {
@@ -6644,7 +6650,12 @@ sub WriteJPEG($$)
6644
6650
  $segType = 'SEAL';
6645
6651
  $$delGroup{SEAL} and $del = 1;
6646
6652
  }
6647
- } elsif ($marker == 0xeb) { # APP10 (JUMBF)
6653
+ } elsif ($marker == 0xea) { # APP10 (AROT)
6654
+ if ($$segDataPt =~ /^AROT\0\0/) {
6655
+ $segType = 'AROT';
6656
+ $$delGroup{AROT} and $del = 1;
6657
+ }
6658
+ } elsif ($marker == 0xeb) { # APP11 (JUMBF)
6648
6659
  if ($$segDataPt =~ /^JP/) {
6649
6660
  $segType = 'JUMBF';
6650
6661
  $$delGroup{JUMBF} and $del = 1;
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.72';
53
+ $VERSION = '3.74';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -3539,14 +3539,19 @@ NoLoop:
3539
3539
  }
3540
3540
  last unless $sti;
3541
3541
  }
3542
- # generate new tagInfo hash based on existing top-level tag
3543
- $tagInfo = { %$sti, Name => $flat . $$sti{Name} };
3544
- # be careful not to copy elements we shouldn't...
3545
- delete $$tagInfo{Description}; # Description will be different
3546
- # can't copy group hash because group 1 will be different and
3547
- # we need to check this when writing tag to a specific group
3548
- delete $$tagInfo{Groups};
3549
- $$tagInfo{Groups}{2} = $$sti{Groups}{2} if $$sti{Groups};
3542
+ # use existing definition if we already added this tag
3543
+ if ($$tagTablePtr{$tagID}) {
3544
+ $tagInfo = $$tagTablePtr{$tagID};
3545
+ } else {
3546
+ # generate new tagInfo hash based on existing top-level tag
3547
+ $tagInfo = { %$sti, Name => $flat . $$sti{Name} };
3548
+ # be careful not to copy elements we shouldn't...
3549
+ delete $$tagInfo{Description}; # Description will be different
3550
+ # can't copy group hash because group 1 will be different and
3551
+ # we need to check this when writing tag to a specific group
3552
+ delete $$tagInfo{Groups};
3553
+ $$tagInfo{Groups}{2} = $$sti{Groups}{2} if $$sti{Groups};
3554
+ }
3550
3555
  last;
3551
3556
  }
3552
3557
  }
@@ -3592,13 +3597,15 @@ NoLoop:
3592
3597
  #} elsif (grep / /, @$props) {
3593
3598
  # $$tagInfo{List} = 1;
3594
3599
  }
3595
- # save property list for verbose "adding" message unless this tag already exists
3596
- $added = \@tagList unless $$tagTablePtr{$tagID};
3597
- # if this is an empty structure, we must add a Struct field
3598
- if (not length $val and $$attrs{'rdf:parseType'} and $$attrs{'rdf:parseType'} eq 'Resource') {
3599
- $$tagInfo{Struct} = { STRUCT_NAME => 'XMP Unknown' };
3600
+ unless ($$tagTablePtr{$tagID} and $$tagTablePtr{$tagID} eq $tagInfo) {
3601
+ # save property list for verbose "adding" message unless this tag already exists
3602
+ $added = \@tagList unless $$tagTablePtr{$tagID};
3603
+ # if this is an empty structure, we must add a Struct field
3604
+ if (not length $val and $$attrs{'rdf:parseType'} and $$attrs{'rdf:parseType'} eq 'Resource') {
3605
+ $$tagInfo{Struct} = { STRUCT_NAME => 'XMP Unknown' } unless $$tagInfo{Struct};
3606
+ }
3607
+ AddTagToTable($tagTablePtr, $tagID, $tagInfo);
3600
3608
  }
3601
- AddTagToTable($tagTablePtr, $tagID, $tagInfo);
3602
3609
  last;
3603
3610
  }
3604
3611
  # decode value if necessary (et:encoding was used before exiftool 7.71)
@@ -3823,7 +3830,7 @@ sub ParseXMPElement($$$;$$$$)
3823
3830
  for (;;) {
3824
3831
  my ($attr, $quote);
3825
3832
  if (length($attrs) < 2000) { # (do it the easy way if attributes aren't stupid long)
3826
- last unless $attrs =~ /(\S+)\s*=\s*(['"])/g;
3833
+ last unless $attrs =~ /(\S+?)\s*=\s*(['"])/g;
3827
3834
  ($attr, $quote) = ($1, $2);
3828
3835
  } else {
3829
3836
  # 13.23 patch to avoid capturing tons of garbage if XMP is corrupted
@@ -170,7 +170,11 @@ my %sAppInfo = (
170
170
  %xmpTableDefaults,
171
171
  GROUPS => { 1 => 'XMP-xmpDM', 2 => 'Image' },
172
172
  NAMESPACE => 'xmpDM',
173
- NOTES => 'XMP Dynamic Media namespace tags.',
173
+ NOTES => q{
174
+ XMP Dynamic Media namespace tags. See
175
+ L<https://developer.adobe.com/xmp/docs/XMPNamespaces/xmpDM/> for the
176
+ specification.
177
+ },
174
178
  absPeakAudioFilePath=> { },
175
179
  album => { },
176
180
  altTapeName => { },
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars $advFmtSelf);
31
31
 
32
- $VERSION = '13.25';
32
+ $VERSION = '13.29';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -9213,10 +9213,14 @@ sub HandleTag($$$$;%)
9213
9213
  if ($start >= 0 and $start + $size <= $dLen) {
9214
9214
  $format = $$tagInfo{Format} || $$tagTablePtr{FORMAT};
9215
9215
  $format = $pfmt if not $format and $pfmt and $formatSize{$pfmt};
9216
- if ($format) {
9216
+ if (not $format) {
9217
+ $val = substr($$dataPt, $start, $size);
9218
+ } elsif (not $$tagInfo{ByteOrder}) {
9217
9219
  $val = ReadValue($dataPt, $start, $format, $$tagInfo{Count}, $size, \$rational);
9218
9220
  } else {
9219
- $val = substr($$dataPt, $start, $size);
9221
+ my $oldOrder = GetByteOrder(), SetByteOrder($$tagInfo{ByteOrder});
9222
+ $val = ReadValue($dataPt, $start, $format, $$tagInfo{Count}, $size, \$rational);
9223
+ SetByteOrder($oldOrder);
9220
9224
  }
9221
9225
  $binVal = substr($$dataPt, $start, $size) if $$self{OPTIONS}{SaveBin};
9222
9226
  } else {