exiftool_vendored 12.98.0 → 13.02.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +73 -1
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/arg_files/exif2xmp.args +4 -0
  7. data/bin/arg_files/xmp2exif.args +4 -0
  8. data/bin/config_files/example.config +2 -1
  9. data/bin/exiftool +297 -66
  10. data/bin/lib/Image/ExifTool/APP12.pm +3 -2
  11. data/bin/lib/Image/ExifTool/CBOR.pm +4 -1
  12. data/bin/lib/Image/ExifTool/Canon.pm +36 -26
  13. data/bin/lib/Image/ExifTool/Exif.pm +8 -9
  14. data/bin/lib/Image/ExifTool/FlashPix.pm +5 -9
  15. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  16. data/bin/lib/Image/ExifTool/Geotag.pm +6 -5
  17. data/bin/lib/Image/ExifTool/GoPro.pm +2 -2
  18. data/bin/lib/Image/ExifTool/Import.pm +7 -3
  19. data/bin/lib/Image/ExifTool/JSON.pm +3 -4
  20. data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
  21. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  22. data/bin/lib/Image/ExifTool/Lytro.pm +2 -2
  23. data/bin/lib/Image/ExifTool/M2TS.pm +2 -2
  24. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  25. data/bin/lib/Image/ExifTool/MacOS.pm +2 -1
  26. data/bin/lib/Image/ExifTool/Nikon.pm +5 -2
  27. data/bin/lib/Image/ExifTool/PDF.pm +7 -3
  28. data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -1
  29. data/bin/lib/Image/ExifTool/QuickTime.pm +11 -1
  30. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +88 -9
  31. data/bin/lib/Image/ExifTool/TagLookup.pm +14 -9
  32. data/bin/lib/Image/ExifTool/TagNames.pod +37 -20
  33. data/bin/lib/Image/ExifTool/Text.pm +3 -2
  34. data/bin/lib/Image/ExifTool/Validate.pm +2 -2
  35. data/bin/lib/Image/ExifTool/WriteXMP.pl +16 -4
  36. data/bin/lib/Image/ExifTool/Writer.pl +42 -61
  37. data/bin/lib/Image/ExifTool/XMP.pm +13 -3
  38. data/bin/lib/Image/ExifTool/XMPStruct.pl +16 -9
  39. data/bin/lib/Image/ExifTool.pm +190 -77
  40. data/bin/lib/Image/ExifTool.pod +73 -36
  41. data/bin/perl-Image-ExifTool.spec +1 -1
  42. data/lib/exiftool_vendored/version.rb +1 -1
  43. metadata +2 -2
@@ -109,7 +109,7 @@ my %insvLimit = (
109
109
  The tags below are extracted from timed metadata in QuickTime and other
110
110
  formats of video files when the ExtractEmbedded option is used. Although
111
111
  most of these tags are combined into the single table below, ExifTool
112
- currently reads 77 different formats of timed GPS metadata from video files.
112
+ currently reads 78 different formats of timed GPS metadata from video files.
113
113
  },
114
114
  VARS => { NO_ID => 1 },
115
115
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -591,8 +591,8 @@ my %insvLimit = (
591
591
  GROUPS => { 2 => 'Location' },
592
592
  FIRST_ENTRY => 0,
593
593
  NOTES => q{
594
- Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and
595
- subtitle text in some other videos.
594
+ Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
595
+ and subtitle text in some other videos.
596
596
  },
597
597
  Lat => {
598
598
  Name => 'GPSLatitude',
@@ -619,6 +619,32 @@ my %insvLimit = (
619
619
  PrintConv => '$self->ConvertDateTime($val)',
620
620
  },
621
621
  Text => { Groups => { 2 => 'Other' } },
622
+ # the following tags are extracted from Autel Evo II drone videos
623
+ GPSDateTime => {
624
+ Groups => { 2 => 'Time' },
625
+ Description => 'GPS Date/Time',
626
+ PrintConv => '$self->ConvertDateTime($val)',
627
+ },
628
+ HomeLat => {
629
+ Name => 'GPSHomeLatitude',
630
+ RawConv => '$$self{FoundGPSLatitude} = 1; $val',
631
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
632
+ },
633
+ HomeLon => {
634
+ Name => 'GPSHomeLongitude',
635
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
636
+ },
637
+ ISO => { },
638
+ SHUTTER => {
639
+ Name => 'ExposureTime',
640
+ ValueConv => '1 / $val',
641
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
642
+ },
643
+ 'F-NUM' => {
644
+ Name => 'FNumber',
645
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
646
+ },
647
+ EV => 'ExposureCompensation',
622
648
  );
623
649
 
624
650
  %Image::ExifTool::QuickTime::INSV_MakerNotes = (
@@ -2163,9 +2189,26 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2163
2189
  push(@xtra, $1 => $2), next;
2164
2190
  }
2165
2191
 
2192
+ } elsif ($$dataPt =~ m/^.{30}A.{20}VV/) {
2193
+
2194
+ $debug and $et->FoundTag(GPSType => 17);
2195
+ # 70mai A810 dashcam (note: no timestamps in the samples I have)
2196
+ # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 ed 01 00 00 [..@.freeGPS ....]
2197
+ # 0010: 03 00 ed 01 00 00 00 0f 00 00 70 08 00 00 41 66 [..........p...Af]
2198
+ # 0020: 13 7d 1e 3c 11 dc 03 5d 01 00 00 01 00 00 00 23 [.}.<...].......#]
2199
+ # 0030: 00 00 00 56 56 00 00 00 00 00 00 00 00 00 00 00 [...VV...........]
2200
+ # 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
2201
+ SetByteOrder('II');
2202
+ SetGPSDateTime($et, $tagTbl, $$dirInfo{SampleTime});
2203
+ $lat = Get32s($dataPt, 31) / 1e5;
2204
+ $lon = Get32s($dataPt, 35) / 1e5;
2205
+ $spd = Get32s($dataPt, 43); # (seems to be km/h but not confirmed)
2206
+ # offset 475 - int16u=N string[N] - some sort of settings?:
2207
+ # eg. "\x15\x00{pA:V,rA:V,sF:0,tF:2}"
2208
+
2166
2209
  } else {
2167
2210
 
2168
- $debug and $et->FoundTag(GPSType => 17);
2211
+ $debug and $et->FoundTag(GPSType => 18);
2169
2212
  # (look for binary GPS as stored by Nextbase 512G, ref PH)
2170
2213
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...]
2171
2214
  # 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
@@ -2344,7 +2387,7 @@ sub ParseTag($$$)
2344
2387
  }
2345
2388
 
2346
2389
  #------------------------------------------------------------------------------
2347
- # Process Yuneec 'tx3g' sbtl metadata (ref PH)
2390
+ # Process Yuneec 'tx3g' and Autel sbtl metadata (ref PH)
2348
2391
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2349
2392
  # Returns: 1 on success
2350
2393
  sub Process_tx3g($$$)
@@ -2352,13 +2395,49 @@ sub Process_tx3g($$$)
2352
2395
  my ($et, $dirInfo, $tagTablePtr) = @_;
2353
2396
  my $dataPt = $$dirInfo{DataPt};
2354
2397
  return 0 if length $$dataPt < 2;
2355
- pos($$dataPt) = 2; # skip 2-byte length word
2356
2398
  $et->VerboseDir('tx3g', undef, length($$dataPt)-2);
2357
- $et->HandleTag($tagTablePtr, 'Text', substr($$dataPt, 2));
2358
- if ($$dataPt =~ /^..\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) {
2399
+ my $text = substr($$dataPt, 2); # remove 2-byte length word
2400
+ $et->HandleTag($tagTablePtr, 'Text', $text);
2401
+ if ($text =~ /^HOME\(/) {
2402
+ # --- sample text from Autel Evo II drone ---
2403
+ # HOME(W: 109.318642, N: 40.769371) 2023-09-12 10:28:07
2404
+ # GPS(W: 109.339287, N: 40.768574, 2371.76m)
2405
+ # HDR ISO:100 SHUTTER:1000 EV:-0.7 F-NUM:1.8
2406
+ # F.PRY (1.0\xc2\xb0, -3.7\xc2\xb0, -59.0\xc2\xb0), G.PRY (-51.1\xc2\xb0, 0.0\xc2\xb0, -58.9\xc2\xb0)
2407
+ my $line;
2408
+ foreach $line (split /\x0a/, $text) {
2409
+ if ($line =~ /^HOME\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+)\)\s*(.*)/) {
2410
+ my ($lon, $lat, $time) = ($2, $4, $5);
2411
+ $lon = -$lon if $1 eq 'W';
2412
+ $lat = -$lat if $3 eq 'S';
2413
+ $time =~ tr/-/:/; # (likely local time zone, but not confirmed)
2414
+ $et->HandleTag($tagTablePtr, GPSDateTime => $time);
2415
+ $et->HandleTag($tagTablePtr, HomeLat => $lat);
2416
+ $et->HandleTag($tagTablePtr, HomeLon => $lon);
2417
+ } elsif ($line =~ /^GPS\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+),\s*(.*)m/) {
2418
+ my ($lon, $lat, $alt) = ($2, $4, $5);
2419
+ $lon = -$lon if $1 eq 'W';
2420
+ $lat = -$lat if $3 eq 'S';
2421
+ $et->HandleTag($tagTablePtr, Lat => $lat);
2422
+ $et->HandleTag($tagTablePtr, Lon => $lon);
2423
+ $et->HandleTag($tagTablePtr, Alt => $alt);
2424
+ } elsif ($line =~ /^F\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
2425
+ $et->HandleTag($tagTablePtr, Yaw => $1);
2426
+ $et->HandleTag($tagTablePtr, Pitch => $2);
2427
+ $et->HandleTag($tagTablePtr, Roll => $3);
2428
+ if ($line =~ /G\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
2429
+ $et->HandleTag($tagTablePtr, GimYaw => $1);
2430
+ $et->HandleTag($tagTablePtr, GimPitch => $2);
2431
+ $et->HandleTag($tagTablePtr, GimRoll => $3);
2432
+ }
2433
+ } else {
2434
+ $et->HandleTag($tagTablePtr, $1, $2) while $line =~ /([-\w]+):([^:]*[^:\s])(\s|$)/sg;
2435
+ }
2436
+ }
2437
+ } elsif ($text =~ /^\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) {
2359
2438
  $et->HandleTag($tagTablePtr, 'DateTime', "$1:$2:$3 $4$5$6:$7");
2360
2439
  } else {
2361
- $et->HandleTag($tagTablePtr, $1, $2) while $$dataPt =~ /(\w+):([^:]*[^:\s])(\s|$)/sg;
2440
+ $et->HandleTag($tagTablePtr, $1, $2) while $text =~ /(\w+):([^:]*[^:\s])(\s|$)/sg;
2362
2441
  }
2363
2442
  return 1;
2364
2443
  }
@@ -1349,7 +1349,7 @@ my %tagLookup = (
1349
1349
  'camerae-mountversion' => { 490 => 0xb },
1350
1350
  'cameraelevationangle' => { 124 => 0x9405, 524 => 'CameraElevationAngle' },
1351
1351
  'camerafilename' => { 507 => 'CameraFilename' },
1352
- 'camerafirmware' => { 124 => 0xa439 },
1352
+ 'camerafirmware' => { 124 => 0xa439, 524 => 'CameraFirmware' },
1353
1353
  'cameraid' => { 333 => 0x209, 413 => 'cmid', 429 => 0x209 },
1354
1354
  'cameraidentifier' => { 407 => 'camera.identifier' },
1355
1355
  'cameraimage' => { 495 => [\'Cameras','CamerasCameraImage'] },
@@ -3728,8 +3728,8 @@ my %tagLookup = (
3728
3728
  'imagedustoff' => { 300 => 0xfe443a45 },
3729
3729
  'imageeditcount' => { 388 => 0x41 },
3730
3730
  'imageediting' => { 388 => 0x32 },
3731
- 'imageeditingsoftware' => { 124 => 0xa43b },
3732
- 'imageeditor' => { 124 => 0xa438 },
3731
+ 'imageeditingsoftware' => { 124 => 0xa43b, 524 => 'ImageEditingSoftware' },
3732
+ 'imageeditor' => { 124 => 0xa438, 524 => 'ImageEditor' },
3733
3733
  'imageeffects' => { 420 => 0x1010 },
3734
3734
  'imagefileconstraints' => { 338 => 'ImageFileConstraints' },
3735
3735
  'imagefileformatasdelivered' => { 338 => 'ImageFileFormatAsDelivered' },
@@ -3805,9 +3805,10 @@ my %tagLookup = (
3805
3805
  'imagesuppliername' => { 338 => [\'ImageSupplier','ImageSupplierImageSupplierName'] },
3806
3806
  'imagetemperaturemax' => { 126 => 0x1 },
3807
3807
  'imagetemperaturemin' => { 126 => 0x2 },
3808
+ 'imagetitle' => { 124 => 0xa436, 524 => 'ImageTitle' },
3808
3809
  'imagetone' => { 388 => 0x4f },
3809
3810
  'imagetype' => { 136 => 0x82, 338 => 'ImageType' },
3810
- 'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID' },
3811
+ 'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID', 524 => 'ImageUniqueID' },
3811
3812
  'imagewidth' => { 124 => 0x100, 193 => 0xe, 397 => 0x10c, 502 => 'ImageWidth', 542 => 'ImageWidth' },
3812
3813
  'inclinationangle' => { 491 => 0x900f },
3813
3814
  'inclinationcorrection' => { 491 => 0x900e },
@@ -4796,7 +4797,7 @@ my %tagLookup = (
4796
4797
  'metadataauthorityidentifier' => { 531 => [\'metadataAuthority','metadataAuthorityIdentifier'] },
4797
4798
  'metadataauthorityname' => { 531 => [\'metadataAuthority','metadataAuthorityName'] },
4798
4799
  'metadatadate' => { 544 => 'MetadataDate' },
4799
- 'metadataeditingsoftware' => { 124 => 0xa43c },
4800
+ 'metadataeditingsoftware' => { 124 => 0xa43c, 524 => 'MetadataEditingSoftware' },
4800
4801
  'metadatalastedited' => { 531 => 'metadataLastEdited' },
4801
4802
  'metadatalasteditor' => { 531 => 'metadataLastEditor' },
4802
4803
  'metadatalasteditoridentifier' => { 531 => [\'metadataLastEditor','metadataLastEditorIdentifier'] },
@@ -5599,7 +5600,7 @@ my %tagLookup = (
5599
5600
  'photoeffectsgreen' => { 302 => 0x6 },
5600
5601
  'photoeffectsred' => { 302 => 0x4 },
5601
5602
  'photoeffectstype' => { 302 => 0x0 },
5602
- 'photographer' => { 124 => 0xa437 },
5603
+ 'photographer' => { 124 => 0xa437, 524 => 'Photographer' },
5603
5604
  'photographicsensitivity' => { 524 => 'PhotographicSensitivity' },
5604
5605
  'photoidentifier' => { 1 => 0x2b },
5605
5606
  'photoinfoplayback' => { 307 => '17.6', 316 => '33.6' },
@@ -5946,7 +5947,7 @@ my %tagLookup = (
5946
5947
  'rawdevcolorspace' => { 334 => 0x108, 335 => 0x109 },
5947
5948
  'rawdevcontrastvalue' => { 334 => 0x106, 335 => 0x105 },
5948
5949
  'rawdeveditstatus' => { 334 => 0x10b },
5949
- 'rawdevelopingsoftware' => { 124 => 0xa43a },
5950
+ 'rawdevelopingsoftware' => { 124 => 0xa43a, 524 => 'RAWDevelopingSoftware' },
5950
5951
  'rawdevelopmentprocess' => { 388 => 0x62 },
5951
5952
  'rawdevengine' => { 334 => 0x109, 335 => 0x10b },
5952
5953
  'rawdevexposurebiasvalue' => { 334 => 0x100, 335 => 0x100 },
@@ -6940,7 +6941,7 @@ my %tagLookup = (
6940
6941
  'timezoneinfo' => { 105 => 0x2 },
6941
6942
  'timezoneoffset' => { 124 => 0x882a },
6942
6943
  'tint' => { 407 => 'player.movie.visual.tint', 517 => 'Tint', 519 => 'Tint' },
6943
- 'title' => { 124 => 0xa436, 162 => 'Title', 337 => 'Title', 341 => 'Title', 352 => 0x65, 404 => 'Title', 405 => ['titl',"\xa9nam"], 407 => 'title', 413 => ['titl',"\xa9nam"], 520 => 'title', 533 => 'Title', 544 => 'Title' },
6944
+ 'title' => { 162 => 'Title', 337 => 'Title', 341 => 'Title', 352 => 0x65, 404 => 'Title', 405 => ['titl',"\xa9nam"], 407 => 'title', 413 => ['titl',"\xa9nam"], 520 => 'title', 533 => 'Title', 544 => 'Title' },
6944
6945
  'togglestyleamount' => { 517 => 'ToggleStyleAmount', 519 => 'ToggleStyleAmount' },
6945
6946
  'togglestyledigest' => { 517 => 'ToggleStyleDigest', 519 => 'ToggleStyleDigest' },
6946
6947
  'tonecomp' => { 241 => 0x81 },
@@ -8686,7 +8687,6 @@ my %tagExists = (
8686
8687
  'cont' => 1,
8687
8688
  'contactnames' => 1,
8688
8689
  'containerversion' => 1,
8689
- 'contake' => 1,
8690
8690
  'contentbranding' => 1,
8691
8691
  'contentdescribes' => 1,
8692
8692
  'contentdescription' => 1,
@@ -8709,6 +8709,7 @@ my %tagExists = (
8709
8709
  'contrastadjustment' => 1,
8710
8710
  'contrastinfo' => 1,
8711
8711
  'controller' => 1,
8712
+ 'conttake' => 1,
8712
8713
  'convergenceangle' => 1,
8713
8714
  'convergencebaseimage' => 1,
8714
8715
  'convergencedistance' => 1,
@@ -8820,6 +8821,7 @@ my %tagExists = (
8820
8821
  'customfunctionsd30' => 1,
8821
8822
  'customfunctionsd60' => 1,
8822
8823
  'customfunctionsunknown' => 1,
8824
+ 'custominfo' => 1,
8823
8825
  'customsettingsd3' => 1,
8824
8826
  'customsettingsd300' => 1,
8825
8827
  'customsettingsd300s' => 1,
@@ -9741,6 +9743,8 @@ my %tagExists = (
9741
9743
  'gpsframingaltitude' => 1,
9742
9744
  'gpsframinglatitude' => 1,
9743
9745
  'gpsframinglongitude' => 1,
9746
+ 'gpshomelatitude' => 1,
9747
+ 'gpshomelongitude' => 1,
9744
9748
  'gpshorizontalaccuracy' => 1,
9745
9749
  'gpsinfo' => 1,
9746
9750
  'gpslatitude2' => 1,
@@ -12014,6 +12018,7 @@ my %tagExists = (
12014
12018
  'scenebalancealgorithmrevision' => 1,
12015
12019
  'sceneclassification' => 1,
12016
12020
  'scenecolorimetryestimates' => 1,
12021
+ 'sceneilluminance' => 1,
12017
12022
  'scheduleitemid' => 1,
12018
12023
  'schemeinfo' => 1,
12019
12024
  'schemetype' => 1,
@@ -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 28148 tags, with 17486 unique tag names.
15
+ They contain a total of 28165 tags, with 17491 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
@@ -871,7 +871,7 @@ for the official EXIF 2.32 specification.
871
871
  0xa433 LensMake ExifIFD string
872
872
  0xa434 LensModel ExifIFD string
873
873
  0xa435 LensSerialNumber ExifIFD string
874
- 0xa436 Title ExifIFD string/
874
+ 0xa436 ImageTitle ExifIFD string
875
875
  0xa437 Photographer ExifIFD string
876
876
  0xa438 ImageEditor ExifIFD string
877
877
  0xa439 CameraFirmware ExifIFD string
@@ -4605,7 +4605,7 @@ These tags belong to the ExifTool XMP-exif family 1 group.
4605
4605
  GPSTrack rational
4606
4606
  GPSTrackRef string
4607
4607
  GPSVersionID string
4608
- ImageUniqueID string
4608
+ ImageUniqueID string/
4609
4609
  ISO integer+
4610
4610
  LightSource string
4611
4611
  MakerNote string
@@ -4686,6 +4686,7 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4686
4686
  Acceleration rational
4687
4687
  SerialNumber string
4688
4688
  CameraElevationAngle rational
4689
+ CameraFirmware string
4689
4690
  OwnerName string
4690
4691
  CompositeImage integer
4691
4692
  CompositeImageCount integer+
@@ -4702,6 +4703,10 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4702
4703
  CompImageValues rational_+
4703
4704
  Gamma rational
4704
4705
  Humidity rational
4706
+ ImageEditingSoftware string
4707
+ ImageEditor string
4708
+ ImageTitle string
4709
+ ImageUniqueID string
4705
4710
  InteropIndex string
4706
4711
  ISOSpeed integer
4707
4712
  ISOSpeedLatitudeyyy integer
@@ -4710,8 +4715,11 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4710
4715
  LensModel string
4711
4716
  LensSerialNumber string
4712
4717
  LensInfo rational+
4718
+ MetadataEditingSoftware string
4719
+ Photographer string
4713
4720
  PhotographicSensitivity integer
4714
4721
  Pressure rational
4722
+ RAWDevelopingSoftware string
4715
4723
  RecommendedExposureIndex integer
4716
4724
  SensitivityType integer
4717
4725
  StandardOutputSensitivity integer
@@ -26163,7 +26171,7 @@ from any tags found in this segment.
26163
26171
  ------ -------- --------
26164
26172
  'Aperture' Aperture no
26165
26173
  'ColorMode' ColorMode no
26166
- 'ConTake' ConTake no
26174
+ 'ContTake' ContTake no
26167
26175
  'ExpBias' ExposureCompensation no
26168
26176
  'FNumber' FNumber no
26169
26177
  'FWare' FirmwareVersion no
@@ -29846,6 +29854,7 @@ for the official QuickTime specification.
29846
29854
  'PICT' PreviewPICT no
29847
29855
  '_htc' HTCInfo QuickTime HTCInfo
29848
29856
  'ardt' ARDroneFile no
29857
+ 'cust' CustomInfo no
29849
29858
  'frea' Kodak_frea Kodak frea
29850
29859
  'free' KodakFree Kodak Free
29851
29860
  Pittasoft QuickTime Pittasoft
@@ -29897,7 +29906,7 @@ for the official QuickTime specification.
29897
29906
  The tags below are extracted from timed metadata in QuickTime and other
29898
29907
  formats of video files when the ExtractEmbedded option is used. Although
29899
29908
  most of these tags are combined into the single table below, ExifTool
29900
- currently reads 77 different formats of timed GPS metadata from video files.
29909
+ currently reads 78 different formats of timed GPS metadata from video files.
29901
29910
 
29902
29911
  Tag Name Writable
29903
29912
  -------- --------
@@ -30163,6 +30172,7 @@ changed via the config file.
30163
30172
  'producer' Producer yes
30164
30173
  'publisher' Publisher yes
30165
30174
  'rating.user' UserRating yes
30175
+ 'scene-illuminance' SceneIlluminance no
30166
30176
  'software' Software yes
30167
30177
  'still-image-time' StillImageTime no
30168
30178
  'title' Title yes
@@ -30185,22 +30195,29 @@ changed via the config file.
30185
30195
 
30186
30196
  =head3 QuickTime tx3g Tags
30187
30197
 
30188
- Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and
30189
- subtitle text in some other videos.
30198
+ Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
30199
+ and subtitle text in some other videos.
30190
30200
 
30191
- Tag ID Tag Name Writable
30192
- ------ -------- --------
30193
- 'Alt' GPSAltitude no
30194
- 'DateTime' DateTime no
30195
- 'GimPitch' GimbalPitch no
30196
- 'GimRoll' GimbalRoll no
30197
- 'GimYaw' GimbalYaw no
30198
- 'Lat' GPSLatitude no
30199
- 'Lon' GPSLongitude no
30200
- 'Pitch' Pitch no
30201
- 'Roll' Roll no
30202
- 'Text' Text no
30203
- 'Yaw' Yaw no
30201
+ Tag ID Tag Name Writable
30202
+ ------ -------- --------
30203
+ 'Alt' GPSAltitude no
30204
+ 'DateTime' DateTime no
30205
+ 'EV' ExposureCompensation no
30206
+ 'F-NUM' FNumber no
30207
+ 'GPSDateTime' GPSDateTime no
30208
+ 'GimPitch' GimbalPitch no
30209
+ 'GimRoll' GimbalRoll no
30210
+ 'GimYaw' GimbalYaw no
30211
+ 'HomeLat' GPSHomeLatitude no
30212
+ 'HomeLon' GPSHomeLongitude no
30213
+ 'ISO' ISO no
30214
+ 'Lat' GPSLatitude no
30215
+ 'Lon' GPSLongitude no
30216
+ 'Pitch' Pitch no
30217
+ 'Roll' Roll no
30218
+ 'SHUTTER' ExposureTime no
30219
+ 'Text' Text no
30220
+ 'Yaw' Yaw no
30204
30221
 
30205
30222
  =head3 QuickTime HTCInfo Tags
30206
30223
 
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.04';
18
+ $VERSION = '1.05';
19
19
 
20
20
  # Text tags
21
21
  %Image::ExifTool::Text::Main = (
@@ -191,7 +191,8 @@ sub ProcessTXT($$)
191
191
  $enc = 'unknown-8bit';
192
192
  }
193
193
  }
194
- if ($$et{VALUE}{MIMEEncoding} ne $enc) {
194
+ # ($$et{VALUE}{MIMEEncoding} may be undef if it was ignored)
195
+ if (defined $$et{VALUE}{MIMEEncoding} and $$et{VALUE}{MIMEEncoding} ne $enc) {
195
196
  $$et{VALUE}{MIMEEncoding} = $enc;
196
197
  $et->VPrint(0," MIMEEncoding [override] = $enc\n");
197
198
  }
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
17
17
  use strict;
18
18
  use vars qw($VERSION %exifSpec);
19
19
 
20
- $VERSION = '1.23';
20
+ $VERSION = '1.24';
21
21
 
22
22
  use Image::ExifTool qw(:Utils);
23
23
  use Image::ExifTool::Exif;
@@ -575,7 +575,7 @@ sub FinishValidate($$)
575
575
  # get all tags in this group
576
576
  foreach $key (sort keys %{$$et{VALUE}}) {
577
577
  next unless $et->GetGroup($key, 1) eq $grp;
578
- next if $$et{TAG_EXTRA}{$key} and $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
578
+ next if $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
579
579
  # fill in %val lookup with values based on tag ID
580
580
  my $tag = $$et{TAG_INFO}{$key}{TagID};
581
581
  $val{$tag} = $$et{VALUE}{$key};
@@ -925,19 +925,31 @@ sub WriteXMP($$;$)
925
925
  # get hash of all information we want to change
926
926
  # (sorted by tag name so alternate languages come last, but with structures
927
927
  # first so flattened tags may be used to override individual structure elements)
928
- my (@tagInfoList, $delLangPath, %delLangPaths, %delAllLang, $firstNewPath);
928
+ my (@tagInfoList, @structList, $delLangPath, %delLangPaths, %delAllLang, $firstNewPath, @langTags);
929
929
  my $writeGroup = $$dirInfo{WriteGroup};
930
930
  foreach $tagInfo (sort ByTagName $et->GetNewTagInfoList()) {
931
931
  next unless $et->GetGroup($tagInfo, 0) eq 'XMP';
932
932
  next if $$tagInfo{Name} eq 'XMP'; # (ignore full XMP block if we didn't write it already)
933
933
  next if $writeGroup and $writeGroup ne $$et{NEW_VALUE}{$tagInfo}{WriteGroup};
934
- if ($$tagInfo{Struct}) {
935
- unshift @tagInfoList, $tagInfo;
934
+ if ($$tagInfo{LangCode}) {
935
+ push @langTags, $tagInfo
936
+ } elsif ($$tagInfo{Struct}) {
937
+ push @structList, $tagInfo;
936
938
  } else {
937
939
  push @tagInfoList, $tagInfo;
938
940
  }
939
941
  }
940
- foreach $tagInfo (@tagInfoList) {
942
+ if (@langTags) {
943
+ # keep original order in which lang-alt entries were added
944
+ foreach $tagInfo (sort { $$et{NEW_VALUE}{$a}{Order} <=> $$et{NEW_VALUE}{$b}{Order} } @langTags) {
945
+ if ($$tagInfo{Struct}) {
946
+ push @structList, $tagInfo;
947
+ } else {
948
+ push @tagInfoList, $tagInfo;
949
+ }
950
+ }
951
+ }
952
+ foreach $tagInfo (@structList, @tagInfoList) {
941
953
  my @delPaths; # list of deleted paths
942
954
  my $tag = $$tagInfo{TagID};
943
955
  my $path = GetPropertyPath($tagInfo);
@@ -295,10 +295,11 @@ my %ignorePrintConv = map { $_ => 1 } qw(OTHER BITMASK Notes);
295
295
  # CreateGroups - hash of all family 0 group names where tag may be created
296
296
  # WriteGroup - group name where information is being written (correct case)
297
297
  # WantGroup - group name as specified in call to function (case insensitive)
298
- # Next - pointer to next new value hash (if more than one)
298
+ # Next - pointer to next new value hash (if more than one for this tag)
299
299
  # NoReplace - set if value was created with Replace=0
300
300
  # AddBefore - number of list items added by a subsequent Replace=0 call
301
- # IsNVH - Flag indicating this is a new value hash
301
+ # IsNVH - flag indicating this is a new value hash
302
+ # Order - counter to indicate the order that new value hashes were created
302
303
  # Shift - shift value
303
304
  # Save - counter used by SaveNewValues()/RestoreNewValues()
304
305
  # MAKER_NOTE_FIXUP - pointer to fixup if necessary for a maker note value
@@ -317,7 +318,7 @@ sub SetNewValue($;$$%)
317
318
 
318
319
  unless (defined $tag) {
319
320
  delete $$self{NEW_VALUE};
320
- $$self{SAVE_COUNT} = 0;
321
+ $$self{SAVE_COUNT} = $$self{NV_COUNT} = 0;
321
322
  $$self{DEL_GROUP} = { };
322
323
  return 1;
323
324
  }
@@ -1290,67 +1291,29 @@ sub SetNewValuesFromFile($$;@)
1290
1291
  # ! DON'T FORGET!! Must consider each new !
1291
1292
  # ! option to decide how it is handled here. !
1292
1293
  # +------------------------------------------+
1294
+ foreach (qw(ByteUnit Charset CharsetEXIF CharsetFileName CharsetID3 CharsetIPTC
1295
+ CharsetPhotoshop Composite DateFormat Debug EncodeHangs Escape ExtendedXMP
1296
+ ExtractEmbedded FastScan Filter FixBase Geolocation GeolocAltNames
1297
+ GeolocFeature GeolocMinPop GeolocMaxDist GlobalTimeShift HexTagIDs
1298
+ IgnoreGroups IgnoreMinorErrors IgnoreTags ImageHashType Lang
1299
+ LargeFileSupport ListItem ListSep MDItemTags MissingTagValue NoPDFList
1300
+ NoWarning Password PrintConv QuickTimeUTC RequestTags SaveFormat SavePath
1301
+ ScanForXMP StructFormat SystemTags TimeZone Unknown UserParam Validate
1302
+ WindowsLongPath WindowsWideFile XAttrTags XMPAutoConv))
1303
+ {
1304
+ $srcExifTool->Options($_ => $$options{$_});
1305
+ }
1293
1306
  $srcExifTool->Options(
1294
1307
  Binary => 1,
1295
- ByteUnit => $$options{ByteUnit},
1296
- Charset => $$options{Charset},
1297
- CharsetEXIF => $$options{CharsetEXIF},
1298
- CharsetFileName => $$options{CharsetFileName},
1299
- CharsetID3 => $$options{CharsetID3},
1300
- CharsetIPTC => $$options{CharsetIPTC},
1301
- CharsetPhotoshop=> $$options{CharsetPhotoshop},
1302
- Composite => $$options{Composite},
1303
1308
  CoordFormat => $$options{CoordFormat} || '%d %d %.8f', # copy coordinates at high resolution unless otherwise specified
1304
- DateFormat => $$options{DateFormat},
1305
1309
  Duplicates => 1,
1306
- Escape => $$options{Escape},
1307
1310
  # Exclude (set below)
1308
- ExtendedXMP => $$options{ExtendedXMP},
1309
- ExtractEmbedded => $$options{ExtractEmbedded},
1310
- FastScan => $$options{FastScan},
1311
- Filter => $$options{Filter},
1312
- FixBase => $$options{FixBase},
1313
- Geolocation => $$options{Geolocation},
1314
- GeolocAltNames => $$options{GeolocAltNames},
1315
- GeolocFeature => $$options{GeolocFeature},
1316
- GeolocMinPop => $$options{GeolocMinPop},
1317
- GeolocMaxDist => $$options{GeolocMaxDist},
1318
- GlobalTimeShift => $$options{GlobalTimeShift},
1319
- HexTagIDs => $$options{HexTagIDs},
1320
- IgnoreGroups => $$options{IgnoreGroups},
1321
- IgnoreMinorErrors=>$$options{IgnoreMinorErrors},
1322
- IgnoreTags => $$options{IgnoreTags},
1323
- ImageHashType => $$options{ImageHashType},
1324
- Lang => $$options{Lang},
1325
- LargeFileSupport=> $$options{LargeFileSupport},
1326
1311
  LimitLongValues => 10000000, # (10 MB)
1327
1312
  List => 1,
1328
- ListItem => $$options{ListItem},
1329
- ListSep => $$options{ListSep},
1330
1313
  MakerNotes => $$options{FastScan} && $$options{FastScan} > 1 ? undef : 1,
1331
- MDItemTags => $$options{MDItemTags},
1332
- MissingTagValue => $$options{MissingTagValue},
1333
- NoPDFList => $$options{NoPDFList},
1334
- NoWarning => $$options{NoWarning},
1335
- Password => $$options{Password},
1336
- PrintConv => $$options{PrintConv},
1337
- QuickTimeUTC => $$options{QuickTimeUTC},
1338
1314
  RequestAll => $$options{RequestAll} || 1, # (is this still necessary now that RequestTags are being set?)
1339
- RequestTags => $$options{RequestTags},
1340
- SaveFormat => $$options{SaveFormat},
1341
- SavePath => $$options{SavePath},
1342
- ScanForXMP => $$options{ScanForXMP},
1343
1315
  StrictDate => defined $$options{StrictDate} ? $$options{StrictDate} : 1,
1344
1316
  Struct => $structOpt,
1345
- StructFormat => $$options{StructFormat},
1346
- SystemTags => $$options{SystemTags},
1347
- TimeZone => $$options{TimeZone},
1348
- Unknown => $$options{Unknown},
1349
- UserParam => $$options{UserParam},
1350
- Validate => $$options{Validate},
1351
- WindowsWideFile => $$options{WindowsWideFile},
1352
- XAttrTags => $$options{XAttrTags},
1353
- XMPAutoConv => $$options{XMPAutoConv},
1354
1317
  );
1355
1318
  # reset Geolocation option if we aren't copying any geolocation tags
1356
1319
  if ($$options{Geolocation} and not grep /\bGeolocation/i, @setTags) {
@@ -1389,8 +1352,16 @@ sub SetNewValuesFromFile($$;@)
1389
1352
  return $info if $$info{Error} and $$info{Error} eq 'Error opening file';
1390
1353
  delete $$srcExifTool{VALUE}{Error}; # delete so we can check this later
1391
1354
 
1392
- # sort tags in reverse order so we get priority tag last
1393
- my @tags = reverse sort keys %$info;
1355
+ # sort tags in file order with priority tags last
1356
+ my (@tags, @prio);
1357
+ foreach (sort { $$srcExifTool{FILE_ORDER}{$a} <=> $$srcExifTool{FILE_ORDER}{$b} } keys %$info) {
1358
+ if (/ /) {
1359
+ push @tags, $_;
1360
+ } else {
1361
+ push @prio, $_;
1362
+ }
1363
+ }
1364
+ push @tags, @prio;
1394
1365
  #
1395
1366
  # simply transfer all tags from source image if no tags specified
1396
1367
  #
@@ -2367,9 +2338,13 @@ sub WriteInfo($$;$$)
2367
2338
  } elsif (UNIVERSAL::isa($inRef,'File::RandomAccess')) {
2368
2339
  $inRef->Seek(0);
2369
2340
  $raf = $inRef;
2370
- } elsif ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$inRef) } or $@)) {
2341
+ } elsif ($] >= 5.006 and ($$self{OPTIONS}{EncodeHangs} or
2342
+ eval { require Encode; Encode::is_utf8($$inRef) } or $@))
2343
+ {
2344
+ local $SIG{'__WARN__'} = \&SetWarning;
2371
2345
  # convert image data from UTF-8 to character stream if necessary
2372
- my $buff = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$inRef)) : Encode::encode('utf8',$$inRef);
2346
+ my $buff = ($$self{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
2347
+ 'U0C*' : 'C0C*', $$inRef)) : Encode::encode('utf8', $$inRef);
2373
2348
  if (defined $outfile) {
2374
2349
  $inRef = \$buff;
2375
2350
  } else {
@@ -2942,10 +2917,15 @@ sub Sanitize($$)
2942
2917
  $$valPt = $$$valPt if ref $$valPt eq 'SCALAR';
2943
2918
  # make sure the Perl UTF-8 flag is OFF for the value if perl 5.6 or greater
2944
2919
  # (otherwise our byte manipulations get corrupted!!)
2945
- if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$valPt) } or $@)) {
2920
+ # NOTE: Don't use Encode on Windows becase "require Encode" on Windows hangs if cwd is a long path name!!
2921
+ if ($] >= 5.006 and ($$self{OPTIONS}{EncodeHangs} or
2922
+ eval { require Encode; Encode::is_utf8($$valPt) } or $@))
2923
+ {
2924
+ # (SIG handling was added in 10.39. Not sure why, but I've added this to other similar code for 13.02)
2946
2925
  local $SIG{'__WARN__'} = \&SetWarning;
2947
2926
  # repack by hand if Encode isn't available
2948
- $$valPt = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$valPt)) : Encode::encode('utf8',$$valPt);
2927
+ $$valPt = ($$self{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
2928
+ 'U0C*' : 'C0C*', $$valPt)) : Encode::encode('utf8', $$valPt);
2949
2929
  }
2950
2930
  # un-escape value if necessary
2951
2931
  if ($$self{OPTIONS}{Escape}) {
@@ -3286,7 +3266,7 @@ sub InsertTagValues($$;$$$$)
3286
3266
  my @matches = grep /^$tag(\s|$)/i, @$foundTags;
3287
3267
  @matches = $self->GroupMatches($group, \@matches) if defined $group;
3288
3268
  foreach (@matches) {
3289
- my $doc = $$ex{$_} ? $$ex{$_}{G3} || 0 : 0;
3269
+ my $doc = $$ex{$_}{G3} || 0;
3290
3270
  if (defined $$cacheTag[$doc]) {
3291
3271
  next unless $$cacheTag[$doc] =~ / \((\d+)\)$/;
3292
3272
  my $cur = $1;
@@ -3896,6 +3876,7 @@ sub GetNewValueHash($$;$$$$)
3896
3876
  TagInfo => $tagInfo,
3897
3877
  WriteGroup => $writeGroup,
3898
3878
  IsNVH => 1, # set flag so we can recognize a new value hash
3879
+ Order => $$self{NV_COUNT}++,
3899
3880
  };
3900
3881
  # add entry to our NEW_VALUE hash
3901
3882
  if ($$self{NEW_VALUE}{$tagInfo}) {
@@ -4023,7 +4004,7 @@ sub RemoveNewValuesForGroup($$)
4023
4004
  #------------------------------------------------------------------------------
4024
4005
  # Get list of tagInfo hashes for all new data
4025
4006
  # Inputs: 0) ExifTool object reference, 1) optional tag table pointer
4026
- # Returns: list of tagInfo hashes
4007
+ # Returns: list of tagInfo hashes in no particular order
4027
4008
  sub GetNewTagInfoList($;$)
4028
4009
  {
4029
4010
  my ($self, $tagTablePtr) = @_;