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.
- checksums.yaml +4 -4
- data/bin/Changes +73 -1
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/arg_files/exif2xmp.args +4 -0
- data/bin/arg_files/xmp2exif.args +4 -0
- data/bin/config_files/example.config +2 -1
- data/bin/exiftool +297 -66
- data/bin/lib/Image/ExifTool/APP12.pm +3 -2
- data/bin/lib/Image/ExifTool/CBOR.pm +4 -1
- data/bin/lib/Image/ExifTool/Canon.pm +36 -26
- data/bin/lib/Image/ExifTool/Exif.pm +8 -9
- data/bin/lib/Image/ExifTool/FlashPix.pm +5 -9
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +6 -5
- data/bin/lib/Image/ExifTool/GoPro.pm +2 -2
- data/bin/lib/Image/ExifTool/Import.pm +7 -3
- data/bin/lib/Image/ExifTool/JSON.pm +3 -4
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
- data/bin/lib/Image/ExifTool/LNK.pm +1 -1
- data/bin/lib/Image/ExifTool/Lytro.pm +2 -2
- data/bin/lib/Image/ExifTool/M2TS.pm +2 -2
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MacOS.pm +2 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +5 -2
- data/bin/lib/Image/ExifTool/PDF.pm +7 -3
- data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +11 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +88 -9
- data/bin/lib/Image/ExifTool/TagLookup.pm +14 -9
- data/bin/lib/Image/ExifTool/TagNames.pod +37 -20
- data/bin/lib/Image/ExifTool/Text.pm +3 -2
- data/bin/lib/Image/ExifTool/Validate.pm +2 -2
- data/bin/lib/Image/ExifTool/WriteXMP.pl +16 -4
- data/bin/lib/Image/ExifTool/Writer.pl +42 -61
- data/bin/lib/Image/ExifTool/XMP.pm +13 -3
- data/bin/lib/Image/ExifTool/XMPStruct.pl +16 -9
- data/bin/lib/Image/ExifTool.pm +190 -77
- data/bin/lib/Image/ExifTool.pod +73 -36
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- 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
|
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,
|
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 =>
|
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
|
-
$
|
2358
|
-
|
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
|
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' => {
|
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
|
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
|
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
|
-
'
|
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
|
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,
|
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
|
30192
|
-
------
|
30193
|
-
'Alt'
|
30194
|
-
'DateTime'
|
30195
|
-
'
|
30196
|
-
'
|
30197
|
-
'
|
30198
|
-
'
|
30199
|
-
'
|
30200
|
-
'
|
30201
|
-
'
|
30202
|
-
'
|
30203
|
-
'
|
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.
|
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
|
-
|
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.
|
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}
|
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{
|
935
|
-
|
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
|
-
|
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 -
|
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
|
1393
|
-
my @tags
|
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 (
|
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 ?
|
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
|
-
|
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 ?
|
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{$_}
|
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) = @_;
|