exiftool_vendored 13.17.0 → 13.19.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.
@@ -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 28402 tags, with 17530 unique tag names.
15
+ They contain a total of 28469 tags, with 17576 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
@@ -5566,6 +5566,8 @@ is to write ImageRegion as a structure with these tags as new fields.
5566
5566
 
5567
5567
  =head3 XMP LocationDetails Struct
5568
5568
 
5569
+ Note that the GPS elements of this structure are in the "exif" namespace.
5570
+
5569
5571
  Field Name Writable
5570
5572
  ---------- --------
5571
5573
  City string
@@ -5750,14 +5752,14 @@ These tags belong to the ExifTool XMP-pdf family 1 group.
5750
5752
  =head3 XMP pdfx Tags
5751
5753
 
5752
5754
  PDF extension tags. This namespace is used to store application-defined PDF
5753
- information, so there are no pre-defined tags. User-defined tags must be
5754
- created to enable writing of XMP-pdfx information.
5755
+ information, so there are few pre-defined tags. User-defined tags must be
5756
+ created to enable writing of other XMP-pdfx information.
5755
5757
 
5756
5758
  These tags belong to the ExifTool XMP-pdfx family 1 group.
5757
5759
 
5758
5760
  Tag Name Writable
5759
5761
  -------- --------
5760
- [no tags known]
5762
+ SourceModified string
5761
5763
 
5762
5764
  =head3 XMP photoshop Tags
5763
5765
 
@@ -11518,48 +11520,68 @@ file name combined with the hierarchical protobuf field numbers.
11518
11520
 
11519
11521
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
11520
11522
  which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
11521
- dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5) and
11522
- dvtm_wm265e.proto (Mavic 3).
11523
+ dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
11524
+ dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
11525
+ dvtm_pm320.proto (Mini 4 Pro).
11523
11526
 
11524
11527
  Note that with the protobuf format, numerical tags missing from the output
11525
11528
  for a given protocol should be considered to have the default value of 0.
11526
11529
 
11527
- Tag ID Tag Name Writable
11528
- ------ -------- --------
11529
- 'Protocol' Protocol no
11530
- 'dvtm_AVATA2_1-1-5' SerialNumber no
11531
- 'dvtm_AVATA2_1-1-10' Model no
11532
- 'dvtm_AVATA2_2-2-3-1' SerialNumber2 no
11533
- 'dvtm_AVATA2_2-3' FrameInfo DJI FrameInfo
11534
- 'dvtm_AVATA2_3-1-2' TimeStamp no
11535
- 'dvtm_AVATA2_3-4-4-1' GPSInfo DJI GPSInfo
11536
- 'dvtm_ac203_1-1-5' SerialNumber no
11537
- 'dvtm_ac203_1-1-10' Model no
11538
- 'dvtm_ac203_2-3' FrameInfo DJI FrameInfo
11539
- 'dvtm_ac203_3-4-2-1' GPSInfo DJI GPSInfo
11540
- 'dvtm_ac203_3-4-2-2' GPSAltitude no
11541
- 'dvtm_ac203_3-4-2-6-1' GPSDateTime no
11542
- 'dvtm_ac204_1-1-5' SerialNumber no
11543
- 'dvtm_ac204_1-1-10' Model no
11544
- 'dvtm_ac204_2-3' FrameInfo DJI FrameInfo
11545
- 'dvtm_ac204_3-4-2-1' GPSInfo DJI GPSInfo
11546
- 'dvtm_ac204_3-4-2-2' GPSAltitude no
11547
- 'dvtm_ac204_3-4-2-6-1' GPSDateTime no
11548
- 'dvtm_wm265e_1-1-5' SerialNumber no
11549
- 'dvtm_wm265e_1-1-10' Model no
11550
- 'dvtm_wm265e_2-2' FrameInfo DJI FrameInfo
11551
- 'dvtm_wm265e_3-2-2-1' ISO no
11552
- 'dvtm_wm265e_3-2-3-1' ShutterSpeed no
11553
- 'dvtm_wm265e_3-2-6-1' DigitalZoom no
11554
- 'dvtm_wm265e_3-3-3-1' DroneRoll no
11555
- 'dvtm_wm265e_3-3-3-2' DronePitch no
11556
- 'dvtm_wm265e_3-3-3-3' DroneYaw no
11557
- 'dvtm_wm265e_3-3-4-1' GPSInfo DJI GPSInfo
11558
- 'dvtm_wm265e_3-3-4-2' AbsoluteAltitude no
11559
- 'dvtm_wm265e_3-3-5-1' RelativeAltitude no
11560
- 'dvtm_wm265e_3-4-3-1' GimbalPitch no
11561
- 'dvtm_wm265e_3-4-3-2' GimbalRoll no
11562
- 'dvtm_wm265e_3-4-3-3' GimbalYaw no
11530
+ Tag ID Tag Name Writable
11531
+ ------ -------- --------
11532
+ 'Protocol' Protocol no
11533
+ 'dvtm_AVATA2_1-1-5' SerialNumber no
11534
+ 'dvtm_AVATA2_1-1-10' Model no
11535
+ 'dvtm_AVATA2_2-2-3-1' SerialNumber2 no
11536
+ 'dvtm_AVATA2_2-3' FrameInfo DJI FrameInfo
11537
+ 'dvtm_AVATA2_3-1-2' TimeStamp no
11538
+ 'dvtm_AVATA2_3-4-4-1' GPSInfo DJI GPSInfo
11539
+ 'dvtm_Mini4_Pro_1-1-5' SerialNumber no
11540
+ 'dvtm_Mini4_Pro_1-1-10' Model no
11541
+ 'dvtm_Mini4_Pro_2-3' FrameInfo DJI FrameInfo
11542
+ 'dvtm_Mini4_Pro_3-2-7-1' ISO no
11543
+ 'dvtm_Mini4_Pro_3-3-3' DroneInfo DJI DroneInfo
11544
+ 'dvtm_Mini4_Pro_3-3-4-1' GPSInfo DJI GPSInfo
11545
+ 'dvtm_Mini4_Pro_3-3-4-2' AbsoluteAltitude no
11546
+ 'dvtm_Mini4_Pro_3-3-5-1' RelativeAltitude no
11547
+ 'dvtm_Mini4_Pro_3-4-3' GimbalInfo DJI GimbalInfo
11548
+ 'dvtm_Mini4_Pro_3-2-10-1' ShutterSpeed no
11549
+ 'dvtm_Mini4_Pro_3-2-11-1' FNumber no
11550
+ 'dvtm_Mini4_Pro_3-2-32-1' ColorTemperature no
11551
+ 'dvtm_ac203_1-1-5' SerialNumber no
11552
+ 'dvtm_ac203_1-1-10' Model no
11553
+ 'dvtm_ac203_2-3' FrameInfo DJI FrameInfo
11554
+ 'dvtm_ac203_3-4-2-1' GPSInfo DJI GPSInfo
11555
+ 'dvtm_ac203_3-4-2-2' GPSAltitude no
11556
+ 'dvtm_ac203_3-4-2-6-1' GPSDateTime no
11557
+ 'dvtm_ac204_1-1-5' SerialNumber no
11558
+ 'dvtm_ac204_1-1-10' Model no
11559
+ 'dvtm_ac204_2-3' FrameInfo DJI FrameInfo
11560
+ 'dvtm_ac204_3-4-2-1' GPSInfo DJI GPSInfo
11561
+ 'dvtm_ac204_3-4-2-2' GPSAltitude no
11562
+ 'dvtm_ac204_3-4-2-6-1' GPSDateTime no
11563
+ 'dvtm_pm320_1-1-5' SerialNumber no
11564
+ 'dvtm_pm320_1-1-10' Model no
11565
+ 'dvtm_pm320_2-2' FrameInfo DJI FrameInfo
11566
+ 'dvtm_pm320_3-2-2-1' ISO no
11567
+ 'dvtm_pm320_3-2-3-1' ShutterSpeed no
11568
+ 'dvtm_pm320_3-2-6-1' DigitalZoom no
11569
+ 'dvtm_pm320_3-3-3' DroneInfo DJI DroneInfo
11570
+ 'dvtm_pm320_3-3-4-1' GPSInfo DJI GPSInfo
11571
+ 'dvtm_pm320_3-3-4-2' AbsoluteAltitude no
11572
+ 'dvtm_pm320_3-3-5-1' RelativeAltitude no
11573
+ 'dvtm_pm320_3-4-3' GimbalInfo DJI GimbalInfo
11574
+ 'dvtm_wm265e_1-1-5' SerialNumber no
11575
+ 'dvtm_wm265e_1-1-10' Model no
11576
+ 'dvtm_wm265e_2-2' FrameInfo DJI FrameInfo
11577
+ 'dvtm_wm265e_3-2-2-1' ISO no
11578
+ 'dvtm_wm265e_3-2-3-1' ShutterSpeed no
11579
+ 'dvtm_wm265e_3-2-6-1' DigitalZoom no
11580
+ 'dvtm_wm265e_3-3-3' DroneInfo DJI DroneInfo
11581
+ 'dvtm_wm265e_3-3-4-1' GPSInfo DJI GPSInfo
11582
+ 'dvtm_wm265e_3-3-4-2' AbsoluteAltitude no
11583
+ 'dvtm_wm265e_3-3-5-1' RelativeAltitude no
11584
+ 'dvtm_wm265e_3-4-3' GimbalInfo DJI GimbalInfo
11563
11585
 
11564
11586
  =head3 DJI FrameInfo Tags
11565
11587
 
@@ -11577,6 +11599,22 @@ for a given protocol should be considered to have the default value of 0.
11577
11599
  2 GPSLatitude no
11578
11600
  3 GPSLongitude no
11579
11601
 
11602
+ =head3 DJI DroneInfo Tags
11603
+
11604
+ Tag ID Tag Name Writable
11605
+ ------ -------- --------
11606
+ 1 DroneRoll no
11607
+ 2 DronePitch no
11608
+ 3 DroneYaw no
11609
+
11610
+ =head3 DJI GimbalInfo Tags
11611
+
11612
+ Tag ID Tag Name Writable
11613
+ ------ -------- --------
11614
+ 1 GimbalPitch no
11615
+ 2 GimbalRoll no
11616
+ 3 GimbalYaw no
11617
+
11580
11618
  =head2 FLIR Tags
11581
11619
 
11582
11620
  Information extracted from the maker notes of JPEG images from thermal
@@ -12307,24 +12345,40 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
12307
12345
  Tag ID Tag Name Writable
12308
12346
  ------ -------- --------
12309
12347
  'AALP' AudioLevel no
12348
+ 'ABSC' AutoBoostScore no
12310
12349
  'ACCL' Accelerometer no
12311
12350
  'ALLD' AutoLowLightDuration no
12351
+ 'APTO' AudioProtuneOption no
12352
+ 'ARUW' AspectRatioUnwarped no
12353
+ 'ARWA' AspectRatioWarped no
12312
12354
  'ATTD' Attitude no
12313
12355
  'ATTR' AttitudeTarget no
12356
+ 'AUBT' AudioBlueTooth no
12314
12357
  'AUDO' AudioSetting no
12358
+ 'AUPT' AutoProtune no
12359
+ 'BITR' BitrateSetting no
12315
12360
  'BPOS' Controller? no
12316
12361
  'CASN' CameraSerialNumber no
12362
+ 'CDAT' CreationDate no
12363
+ 'CDTM' CaptureDelayTimer no
12364
+ 'CLDP' ClassificationDataPresent no
12317
12365
  'CORI' CameraOrientation no
12366
+ 'CPIN' ChapterNumber no
12318
12367
  'CSEN' CoyoteSense no
12368
+ 'CTRL' ControlLevel no
12319
12369
  'CYTS' CoyoteStatus no
12320
12370
  'DEVC' DeviceContainer GoPro GPMF
12371
+ 'DUST' DurationSetting no
12321
12372
  'DVID' DeviceID? no
12322
12373
  'DVNM' DeviceName no
12323
- 'DZOM' DigitalZoom no
12374
+ 'DZMX' DigitalZoomAmount no
12375
+ 'DZOM' DigitalZoomOn no
12376
+ 'DZST' DigitalZoom no
12324
12377
  'EISA' ElectronicImageStabilization no
12378
+ 'EISE' ElectronicStabilizationOn no
12325
12379
  'EMPT' Empty? no
12326
12380
  'ESCS' EscapeStatus? no
12327
- 'EXPT' MaximumShutterAngle no
12381
+ 'EXPT' ExposureType no
12328
12382
  'FACE' FaceDetected no
12329
12383
  'FCNM' FaceNumbers no
12330
12384
  'FMWR' FirmwareVersion no
@@ -12339,6 +12393,9 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
12339
12393
  'GPSU' GPSDateTime no
12340
12394
  'GRAV' GravityVector no
12341
12395
  'GYRO' Gyroscope no
12396
+ 'HCLT' HorizonControl no
12397
+ 'HDRV' HDRVideo no
12398
+ 'HSGT' HindsightSettings no
12342
12399
  'HUES' PrediminantHue no
12343
12400
  'IORI' ImageOrientation no
12344
12401
  'ISOE' ISOSpeeds no
@@ -12346,30 +12403,45 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
12346
12403
  'KBAT' BatteryStatus GoPro KBAT
12347
12404
  'LNED' LocalPositionNED no
12348
12405
  'MAGN' Magnetometer no
12406
+ 'MAPX' MappingXCoefficients no
12407
+ 'MAPY' MappingYCoefficients no
12349
12408
  'MINF' Model no
12409
+ 'MMOD' MediaMode no
12350
12410
  'MTRX' AccelerometerMatrix no
12351
12411
  'MUID' MediaUniqueID no
12352
12412
  'MWET' MicrophoneWet no
12413
+ 'MXCF' MappingXMode no
12414
+ 'MYCF' MappingYMode no
12415
+ 'ORDP' OrientationDataPresent no
12353
12416
  'OREN' AutoRotation no
12354
12417
  'ORIN' InputOrientation no
12355
12418
  'ORIO' OutputOrientation no
12356
12419
  'PHDR' HDRSetting no
12420
+ 'PIMD' ProtuneISOMode no
12357
12421
  'PIMN' AutoISOMin no
12358
12422
  'PIMX' AutoISOMax no
12423
+ 'POLY' PolynomialCoefficients no
12359
12424
  'PRES' PhotoResolution no
12360
- 'PRTN' ProTune no
12425
+ 'PRJT' LensProjection no
12426
+ 'PRTN' Protune no
12361
12427
  'PTCL' ColorMode no
12362
12428
  'PTEV' ExposureCompensation no
12363
12429
  'PTSH' Sharpness no
12364
12430
  'PTWB' WhiteBalance no
12431
+ 'PWPR' PowerProfile no
12432
+ 'PYCF' PolynomialPower no
12433
+ 'RAMP' SpeedRampSetting no
12365
12434
  'RATE' Rate no
12366
12435
  'RMRK' Comments no
12367
12436
  'SCAL' ScaleFactor? no
12437
+ 'SCAP' ScheduleCapture no
12368
12438
  'SCEN' SceneClassification no
12369
12439
  'SCPR' ScaledPressure no
12440
+ 'SCTM' ScheduleCaptureTime no
12370
12441
  'SHUT' ExposureTimes no
12371
12442
  'SIMU' ScaledIMU no
12372
12443
  'SIUN' SIUnits? no
12444
+ 'SMTR' SpotMeter no
12373
12445
  'SROT' SensorReadoutTime no
12374
12446
  'STMP' TimeStamp no
12375
12447
  'STNM' StreamName? no
@@ -12390,6 +12462,8 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
12390
12462
  'WNDM' WindProcessing no
12391
12463
  'WRGB' WhiteBalanceRGB no
12392
12464
  'YAVG' LumaAverage no
12465
+ 'ZFOV' DiagonalFieldOfView no
12466
+ 'ZMPL' ZoomScaleNormalization no
12393
12467
 
12394
12468
  =head3 GoPro GLPI Tags
12395
12469
 
@@ -16858,12 +16932,14 @@ These tags are written by Nikon DSLR's which have the live view feature.
16858
16932
  26 AFAreaHeight int16u
16859
16933
  28 ContrastDetectAFInFocus int8u
16860
16934
  AFPointsSelected undef[20]
16935
+ AFPointsSelected int16u
16861
16936
  42 AFImageWidth int16u
16862
16937
  44 AFImageHeight int16u
16863
16938
  46 AFAreaXPosition int16u
16864
16939
  47 FocusPositionHorizontal int8u~
16865
16940
  48 AFAreaYPosition int16u
16866
16941
  AFPointsInFocus undef[20]
16942
+ AFPointsInFocus undef[7]
16867
16943
  49 FocusPositionVertical int8u~
16868
16944
  50 AFAreaWidth int16u
16869
16945
  52 AFAreaHeight int16u
@@ -23069,7 +23145,8 @@ Valid from July 2020 for ILCE-1/7SM3, ILME-FX3.
23069
23145
 
23070
23146
  =head3 Sony Tag9050d Tags
23071
23147
 
23072
- Valid for ILCE-6700/7CM2/7CR/ZV-E1.
23148
+ Valid for ILCE-6700/7CM2/7CR/ZV-E1. Also for ILCE-1M2 when using mechanical
23149
+ shutter.
23073
23150
 
23074
23151
  Index1 Tag Name Writable
23075
23152
  ------ -------- --------
@@ -23979,24 +24056,43 @@ files, and will extract any existing tags even if they aren't listed below.
23979
24056
  These tags belong to the family 0 "PLIST" group, but family 1 group may be
23980
24057
  either "XML" or "PLIST" depending on whether the format is XML or binary.
23981
24058
 
23982
- Tag ID Tag Name Writable
23983
- ------ -------- --------
24059
+ Tag ID Tag Name Writable
24060
+ ------ -------- --------
23984
24061
  'MetaDataList//DateTimeOriginal'
23985
- DateTimeOriginal no
23986
- 'MetaDataList//Duration' Duration no
24062
+ DateTimeOriginal no
24063
+ 'MetaDataList//Duration' Duration no
23987
24064
  'MetaDataList//Geolocation/Latitude'
23988
- GPSLatitude no
24065
+ GPSLatitude no
23989
24066
  'MetaDataList//Geolocation/Longitude'
23990
- GPSLongitude no
24067
+ GPSLongitude no
23991
24068
  'MetaDataList//Geolocation/MapDatum'
23992
- GPSMapDatum no
23993
- 'XMLFileType' XMLFileType no
23994
- 'cast//name' Cast no+
23995
- 'codirectors//name' Codirectors no+
23996
- 'directors//name' Directors no+
23997
- 'producers//name' Producers no+
23998
- 'screenwriters//name' Screenwriters no+
23999
- 'studio//name' Studio no+
24069
+ GPSMapDatum no
24070
+ 'XMLFileType' XMLFileType no
24071
+ 'adjustmentData' AdjustmentData PLIST
24072
+ 'cast//name' Cast no+
24073
+ 'codirectors//name' Codirectors no+
24074
+ 'directors//name' Directors no+
24075
+ 'producers//name' Producers no+
24076
+ 'screenwriters//name' Screenwriters no+
24077
+ 'slowMotion/rate' SlowMotionRate no
24078
+ 'slowMotion/regions' SlowMotionRegions no
24079
+ 'slowMotion/regions/timeRange/duration/epoch'
24080
+ SlowMotionRegionsDurationEpoch no
24081
+ 'slowMotion/regions/timeRange/duration/flags'
24082
+ SlowMotionRegionsDurationFlags no
24083
+ 'slowMotion/regions/timeRange/duration/timescale'
24084
+ SlowMotionRegionsDurationTimeScale no
24085
+ 'slowMotion/regions/timeRange/duration/value'
24086
+ SlowMotionRegionsDurationValue no
24087
+ 'slowMotion/regions/timeRange/start/epoch'
24088
+ SlowMotionRegionsStartTimeEpoch no
24089
+ 'slowMotion/regions/timeRange/start/flags'
24090
+ SlowMotionRegionsStartTimeFlags no
24091
+ 'slowMotion/regions/timeRange/start/timescale'
24092
+ SlowMotionRegionsStartTimeScale no
24093
+ 'slowMotion/regions/timeRange/start/value'
24094
+ SlowMotionRegionsStartTimeValue no
24095
+ 'studio//name' Studio no+
24000
24096
 
24001
24097
  =head2 CanonRaw Tags
24002
24098
 
@@ -29507,6 +29603,7 @@ C<integer>, C<real>, C<boolean> or C<name> for PDF tags.
29507
29603
  'Keywords' Keywords string+
29508
29604
  'ModDate' ModifyDate date
29509
29605
  'Producer' Producer string
29606
+ 'SourceModified' SourceModified date
29510
29607
  'Subject' Subject string
29511
29608
  'Title' Title string
29512
29609
  'Trapped' Trapped string!
@@ -30284,7 +30381,7 @@ for the official QuickTime specification.
30284
30381
  The tags below are extracted from timed metadata in QuickTime and other
30285
30382
  formats of video files when the ExtractEmbedded option is used. Although
30286
30383
  most of these tags are combined into the single table below, ExifTool
30287
- currently reads 100 different types of timed GPS metadata from video files.
30384
+ currently reads 103 different types of timed GPS metadata from video files.
30288
30385
 
30289
30386
  Tag Name Writable
30290
30387
  -------- --------
@@ -31192,7 +31289,7 @@ MP4 sample table box.
31192
31289
  'stps' PartialSyncSamples no
31193
31290
  'stsc' SampleToChunk? no
31194
31291
  'stsd' AudioSampleDesc QuickTime AudioSampleDesc
31195
- VideoSampleDesc QuickTime ImageDesc
31292
+ VisualSampleDesc QuickTime VisualSampleDesc
31196
31293
  HintSampleDesc QuickTime HintSampleDesc
31197
31294
  MetaSampleDesc QuickTime MetaSampleDesc
31198
31295
  OtherSampleDesc QuickTime OtherSampleDesc
@@ -31338,7 +31435,7 @@ Child atoms found in "sinf" and/or "pinf" atoms.
31338
31435
  'enda' Endianness no
31339
31436
  'frma' PurchaseFileFormat no
31340
31437
 
31341
- =head3 QuickTime ImageDesc Tags
31438
+ =head3 QuickTime VisualSampleDesc Tags
31342
31439
 
31343
31440
  ID/Index Tag Name Writable
31344
31441
  -------- -------- --------
@@ -31533,6 +31630,7 @@ the config file.
31533
31630
  'Lvlm' LevelMeter? rational64s
31534
31631
  'MMA0' MinoltaMMA0 Minolta MMA
31535
31632
  'MMA1' MinoltaMMA1 Minolta MMA
31633
+ 'MUID' MediaUID no
31536
31634
  'MVTG' FujiFilmMVTG EXIF
31537
31635
  'NCDT' NikonNCDT Nikon NCDT
31538
31636
  'PANA' PanasonicPANA Panasonic PANA
@@ -32021,7 +32119,7 @@ Tags used in QTIF QuickTime Image Files.
32021
32119
  Tag ID Tag Name Writable
32022
32120
  ------ -------- --------
32023
32121
  'idat' ImageData no
32024
- 'idsc' ImageDescription QuickTime ImageDesc
32122
+ 'idsc' ImageDescription QuickTime VisualSampleDesc
32025
32123
  'iicc' ICC_Profile ICC_Profile
32026
32124
 
32027
32125
  =head2 RIFF Tags
@@ -214,7 +214,7 @@ sub ProcessGoogle($$)
214
214
 
215
215
  delete $$et{ProcessGoogleTrailer}; # reset flag to process the Google trailer
216
216
 
217
- return -1 if $$dirInfo{OutFile};
217
+ return -1 if $$dirInfo{OutFile}; # let caller handle the writing
218
218
 
219
219
  # sometimes DirectoryItemLength is missing the Primary entry
220
220
  $len = [ $len ] unless ref $len eq 'ARRAY';
@@ -566,7 +566,7 @@ sub WriteCRW($$)
566
566
  my $trailPt;
567
567
  while ($success) {
568
568
  # check to see if trailer(s) exist(s)
569
- my $trailInfo = Image::ExifTool::IdentifyTrailer($raf) or last;
569
+ my $trailInfo = $et->IdentifyTrailer($raf) or last;
570
570
  # rewrite the trailer(s)
571
571
  $buff = '';
572
572
  $$trailInfo{OutFile} = \$buff;
@@ -891,7 +891,7 @@ sub WriteQuickTime($$$)
891
891
  $et or return 1; # allow dummy access to autoload this package
892
892
  my ($mdat, @mdat, @mdatEdit, $edit, $track, $outBuff, $co, $term, $delCount);
893
893
  my (%langTags, $canCreate, $delGrp, %boxPos, %didDir, $writeLast, $err, $atomCount);
894
- my ($tag, $lastTag, $lastPos, $errStr, $trailer, $buf2, $keysGrp, $keysPath);
894
+ my ($tag, $lastTag, $lastPos, $errStr, $trailer, $buf2, $keysGrp, $keysPath, $itemIndex);
895
895
  my $outfile = $$dirInfo{OutFile} || return 0;
896
896
  my $raf = $$dirInfo{RAF}; # (will be null for lower-level atoms)
897
897
  my $dataPt = $$dirInfo{DataPt}; # (will be null for top-level atoms)
@@ -982,8 +982,25 @@ sub WriteQuickTime($$$)
982
982
  $atomCount = $$tagTablePtr{VARS}{ATOM_COUNT} if $$tagTablePtr{VARS};
983
983
 
984
984
  $tag = $lastTag = '';
985
-
985
+ $itemIndex = 0 if $dirName eq 'ItemPropertyContainer';
986
+
987
+ # read ahead to parse item property associations if this is 'iprp' ItemProperties
988
+ # (necessary to determine which properties belong to primary item in HEIC file)
989
+ if ($dirName eq 'ItemProperties') {
990
+ my $pos = $raf->Tell();
991
+ for (;;) {
992
+ $raf->Read($buf2, 8) == 8 or last;
993
+ my $size = Get32u(\$buf2, 0) - 8; # (atom size without 8-byte header)
994
+ $tag = substr($buf2, 4, 4);
995
+ last if $size < 0;
996
+ $tag eq 'ipma' or $raf->Seek($size, 1), next;
997
+ ParseItemPropAssoc($buf2,$et) if $raf->Read($buf2,$size) == $size;
998
+ last;
999
+ }
1000
+ $raf->Seek($pos);
1001
+ }
986
1002
  for (;;) { # loop through all atoms at this level
1003
+ ++$itemIndex if defined $itemIndex;
987
1004
  $lastPos = $raf->Tell();
988
1005
  # stop processing if we reached a known trailer
989
1006
  if ($trailer and $lastPos >= $$trailer[1]) {
@@ -1186,6 +1203,32 @@ sub WriteQuickTime($$$)
1186
1203
  }
1187
1204
  undef $tagInfo if $tagInfo and $$tagInfo{AddedUnknown};
1188
1205
 
1206
+ # don't write this tag unless associated with the primary item
1207
+ # (Note: This relies on iinf and dimg coming before iprp)
1208
+ if (defined $itemIndex and $$et{ItemInfo}) {
1209
+ my $items = $$et{ItemInfo};
1210
+ my ($id, $prop, $isPrimary);
1211
+ my $primary = $$et{PrimaryItem} || 0;
1212
+ my $pitem = $$items{$primary} || { };
1213
+ $$pitem{RefersTo} or $$pitem{RefersTo} = { };
1214
+ ItemID2: foreach $id (reverse sort { $a <=> $b } keys %$items) {
1215
+ next unless $$items{$id}{Association};
1216
+ my $item = $$items{$id};
1217
+ foreach $prop (@{$$item{Association}}) {
1218
+ next unless $prop == $itemIndex;
1219
+ my $dont = $dontInherit{$tag} || 0;
1220
+ last unless $id == $primary or (not $dont and
1221
+ ($$item{RefersTo} and $$item{RefersTo}{$primary})) or
1222
+ # special case to assume this property belongs to the primary
1223
+ # image if it belongs to an item referred to by the primary
1224
+ ($dont != 1 and $$pitem{RefersTo}{$id});
1225
+ $isPrimary = 1;
1226
+ last ItemID2;
1227
+ }
1228
+ }
1229
+ undef $tagInfo unless $isPrimary;
1230
+ }
1231
+
1189
1232
  if ($tagInfo and (not defined $$tagInfo{Writable} or $$tagInfo{Writable})) {
1190
1233
  my $subdir = $$tagInfo{SubDirectory};
1191
1234
  my ($newData, @chunkOffset);
@@ -1225,6 +1268,7 @@ sub WriteQuickTime($$$)
1225
1268
  OutFile => $outfile,
1226
1269
  NoRefTest=> 1, # don't check directory references
1227
1270
  WriteGroup => $$tagInfo{WriteGroup},
1271
+ Permanent => $$tagInfo{Permanent},
1228
1272
  # initialize array to hold details about chunk offset table
1229
1273
  # (each entry has 3-5 items: 0=atom type, 1=table offset, 2=table size,
1230
1274
  # 3=optional base offset, 4=optional item ID)
@@ -1564,7 +1608,9 @@ sub WriteQuickTime($$$)
1564
1608
  }
1565
1609
  if ($msg) {
1566
1610
  # (allow empty sample description for non-audio/video handler types, eg. 'url ', 'meta')
1567
- if ($$et{MediaType}) {
1611
+ # (also, incorrectly written 'mett' SampleEntry by Google phones,
1612
+ # see https://exiftool.org/forum/index.php?msg=91158)
1613
+ if ($avType{$$et{MediaType}}) {
1568
1614
  my $grp = $$et{CUR_WRITE_GROUP} || $parent;
1569
1615
  $et->Error("$msg for $grp");
1570
1616
  return $rtnErr;
@@ -4262,9 +4262,11 @@ sub WriteDirectory($$$;$)
4262
4262
  if ($permanentDir{$grp0} and not ($$dirInfo{TagInfo} and $$dirInfo{TagInfo}{Deletable})) {
4263
4263
  undef $delFlag;
4264
4264
  }
4265
- # (never delete an entire QuickTime group)
4266
4265
  if ($delFlag) {
4267
- if (($grp0 =~ /^(MakerNotes)$/ or $grp1 =~ /^(IFD0|ExifIFD|MakerNotes)$/) and
4266
+ if ($$dirInfo{Permanent}) {
4267
+ $self->Warn("Not deleting permanent $dirName directory");
4268
+ undef $grp1;
4269
+ } elsif (($grp0 =~ /^(MakerNotes)$/ or $grp1 =~ /^(IFD0|ExifIFD|MakerNotes)$/) and
4268
4270
  $self->IsRawType() and
4269
4271
  # allow non-permanent MakerNote directories to be deleted (ie. NikonCapture)
4270
4272
  (not $$dirInfo{TagInfo} or not defined $$dirInfo{TagInfo}{Permanent} or
@@ -6027,7 +6029,7 @@ sub WriteJPEG($$)
6027
6029
  Write($outfile, $hdr, $s, $segData) or $err = 1;
6028
6030
  my ($buff, $endPos, $trailInfo);
6029
6031
  my $delPreview = $$self{DEL_PREVIEW};
6030
- $trailInfo = IdentifyTrailer($raf) unless $$delGroup{Trailer};
6032
+ $trailInfo = $self->IdentifyTrailer($raf) unless $$delGroup{Trailer};
6031
6033
  my $nvTrail = $self->GetNewValueHash($Image::ExifTool::Extra{Trailer});
6032
6034
  unless ($oldOutfile or $delPreview or $trailInfo or $$delGroup{Trailer} or $nvTrail or
6033
6035
  $$self{HiddenData})
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.70';
53
+ $VERSION = '3.71';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -1247,8 +1247,22 @@ my %sPantryItem = (
1247
1247
  NAMESPACE => 'pdfx',
1248
1248
  NOTES => q{
1249
1249
  PDF extension tags. This namespace is used to store application-defined PDF
1250
- information, so there are no pre-defined tags. User-defined tags must be
1251
- created to enable writing of XMP-pdfx information.
1250
+ information, so there are few pre-defined tags. User-defined tags must be
1251
+ created to enable writing of other XMP-pdfx information.
1252
+ },
1253
+ SourceModified => {
1254
+ Name => 'SourceModified',
1255
+ Groups => { 2 => 'Time' },
1256
+ Shift => 'Time',
1257
+ ValueConv => 'require Image::ExifTool::PDF; $val = Image::ExifTool::PDF::ConvertPDFDate($val)',
1258
+ ValueConvInv => q{
1259
+ require Image::ExifTool::PDF;
1260
+ $val = Image::ExifTool::PDF::WritePDFValue($self,$val,"date");
1261
+ $val =~ tr/()//d;
1262
+ return $val;
1263
+ },
1264
+ PrintConv => '$self->ConvertDateTime($val)',
1265
+ PrintConvInv => '$self->InverseDateTime($val)',
1252
1266
  },
1253
1267
  );
1254
1268
 
@@ -402,6 +402,7 @@ my %sLocationDetails = (
402
402
  STRUCT_NAME => 'LocationDetails',
403
403
  NAMESPACE => 'Iptc4xmpExt',
404
404
  GROUPS => { 2 => 'Location' },
405
+ NOTES => 'Note that the GPS elements of this structure are in the "exif" namespace.',
405
406
  Identifier => { List => 'Bag', Namespace => 'xmp' },
406
407
  City => { },
407
408
  CountryCode => { },
@@ -420,6 +421,7 @@ my %sLocationDetails = (
420
421
  PrintConvInv => '$val=~s/\s*m$//;$val',
421
422
  },
422
423
  GPSAltitudeRef => {
424
+ Namespace => 'exif',
423
425
  Writable => 'integer',
424
426
  PrintConv => {
425
427
  OTHER => sub {