exiftool_vendored 12.17.1 → 12.32.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 +225 -1
- data/bin/MANIFEST +23 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +45 -43
- data/bin/arg_files/xmp2exif.args +2 -1
- data/bin/config_files/acdsee.config +193 -6
- data/bin/config_files/convert_regions.config +25 -14
- data/bin/config_files/cuepointlist.config +70 -0
- data/bin/config_files/example.config +2 -9
- data/bin/exiftool +142 -87
- data/bin/fmt_files/gpx.fmt +2 -2
- data/bin/fmt_files/gpx_wpt.fmt +2 -2
- data/bin/fmt_files/kml.fmt +1 -1
- data/bin/fmt_files/kml_track.fmt +1 -1
- data/bin/lib/Image/ExifTool/Apple.pm +3 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +30 -12
- data/bin/lib/Image/ExifTool/CBOR.pm +277 -0
- data/bin/lib/Image/ExifTool/Canon.pm +49 -18
- data/bin/lib/Image/ExifTool/DJI.pm +6 -6
- data/bin/lib/Image/ExifTool/DPX.pm +13 -2
- data/bin/lib/Image/ExifTool/DjVu.pm +6 -5
- data/bin/lib/Image/ExifTool/Exif.pm +28 -11
- data/bin/lib/Image/ExifTool/FITS.pm +13 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +35 -10
- data/bin/lib/Image/ExifTool/FujiFilm.pm +19 -8
- data/bin/lib/Image/ExifTool/GPS.pm +22 -11
- data/bin/lib/Image/ExifTool/Geotag.pm +13 -2
- data/bin/lib/Image/ExifTool/GoPro.pm +16 -1
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -2
- data/bin/lib/Image/ExifTool/ID3.pm +15 -3
- data/bin/lib/Image/ExifTool/JPEG.pm +74 -4
- data/bin/lib/Image/ExifTool/JSON.pm +27 -4
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +393 -16
- data/bin/lib/Image/ExifTool/LIF.pm +153 -0
- data/bin/lib/Image/ExifTool/Lang/nl.pm +60 -59
- data/bin/lib/Image/ExifTool/M2TS.pm +137 -5
- data/bin/lib/Image/ExifTool/MIE.pm +4 -3
- data/bin/lib/Image/ExifTool/MRC.pm +341 -0
- data/bin/lib/Image/ExifTool/MWG.pm +3 -3
- data/bin/lib/Image/ExifTool/MXF.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/Microsoft.pm +298 -82
- data/bin/lib/Image/ExifTool/Nikon.pm +19 -8
- data/bin/lib/Image/ExifTool/NikonSettings.pm +28 -11
- data/bin/lib/Image/ExifTool/Olympus.pm +6 -3
- data/bin/lib/Image/ExifTool/Other.pm +93 -0
- data/bin/lib/Image/ExifTool/PDF.pm +9 -12
- data/bin/lib/Image/ExifTool/PNG.pm +8 -7
- data/bin/lib/Image/ExifTool/Panasonic.pm +28 -3
- data/bin/lib/Image/ExifTool/Pentax.pm +28 -5
- data/bin/lib/Image/ExifTool/PhaseOne.pm +4 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +6 -0
- data/bin/lib/Image/ExifTool/QuickTime.pm +247 -88
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +283 -141
- data/bin/lib/Image/ExifTool/README +3 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +89 -12
- data/bin/lib/Image/ExifTool/Samsung.pm +48 -10
- data/bin/lib/Image/ExifTool/Shortcuts.pm +9 -0
- data/bin/lib/Image/ExifTool/Sony.pm +237 -78
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +4125 -4028
- data/bin/lib/Image/ExifTool/TagNames.pod +644 -286
- data/bin/lib/Image/ExifTool/Torrent.pm +18 -11
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
- data/bin/lib/Image/ExifTool/WritePNG.pl +2 -0
- data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +55 -21
- data/bin/lib/Image/ExifTool/WriteXMP.pl +7 -3
- data/bin/lib/Image/ExifTool/Writer.pl +47 -10
- data/bin/lib/Image/ExifTool/XMP.pm +39 -14
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +121 -2
- data/bin/lib/Image/ExifTool.pm +223 -72
- data/bin/lib/Image/ExifTool.pod +114 -93
- data/bin/perl-Image-ExifTool.spec +43 -42
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +28 -13
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
56
56
|
use Image::ExifTool qw(:DataAccess :Utils);
|
57
57
|
use Image::ExifTool::MakerNotes;
|
58
58
|
|
59
|
-
$VERSION = '4.
|
59
|
+
$VERSION = '4.36';
|
60
60
|
|
61
61
|
sub ProcessExif($$$);
|
62
62
|
sub WriteExif($$$);
|
@@ -321,6 +321,7 @@ my %utf8StringConv = (
|
|
321
321
|
my %longBin = (
|
322
322
|
ValueConv => 'length($val) > 64 ? \$val : $val',
|
323
323
|
ValueConvInv => '$val',
|
324
|
+
LongBinary => 1, # flag to avoid decoding values of a large array
|
324
325
|
);
|
325
326
|
|
326
327
|
# PrintConv for SampleFormat (0x153)
|
@@ -1452,6 +1453,7 @@ my %opcodeInfo = (
|
|
1452
1453
|
1 => 'Sony Uncompressed 12-bit RAW', #IB
|
1453
1454
|
2 => 'Sony Compressed RAW', # (lossy, ref IB)
|
1454
1455
|
3 => 'Sony Lossless Compressed RAW', #IB
|
1456
|
+
4 => 'Sony Lossless Compressed RAW 2', #JR (ILCE-1)
|
1455
1457
|
},
|
1456
1458
|
},
|
1457
1459
|
# 0x7001 - int16u[1] (in SubIFD of Sony ARW images) - values: 0,1
|
@@ -1472,6 +1474,7 @@ my %opcodeInfo = (
|
|
1472
1474
|
PrintConv => {
|
1473
1475
|
256 => 'Off',
|
1474
1476
|
257 => 'Auto',
|
1477
|
+
272 => 'Auto (ILCE-1)', #JR
|
1475
1478
|
511 => 'No correction params available',
|
1476
1479
|
},
|
1477
1480
|
},
|
@@ -2578,7 +2581,7 @@ my %opcodeInfo = (
|
|
2578
2581
|
0xa301 => {
|
2579
2582
|
Name => 'SceneType',
|
2580
2583
|
Writable => 'undef',
|
2581
|
-
ValueConvInv => 'chr($val)',
|
2584
|
+
ValueConvInv => 'chr($val & 0xff)',
|
2582
2585
|
PrintConv => {
|
2583
2586
|
1 => 'Directly photographed',
|
2584
2587
|
},
|
@@ -3616,11 +3619,11 @@ my %opcodeInfo = (
|
|
3616
3619
|
},
|
3617
3620
|
0xc6fc => {
|
3618
3621
|
Name => 'ProfileToneCurve',
|
3622
|
+
%longBin,
|
3619
3623
|
Writable => 'float',
|
3620
3624
|
WriteGroup => 'IFD0',
|
3621
3625
|
Count => -1,
|
3622
3626
|
Protected => 1,
|
3623
|
-
Binary => 1,
|
3624
3627
|
},
|
3625
3628
|
0xc6fd => {
|
3626
3629
|
Name => 'ProfileEmbedPolicy',
|
@@ -3745,11 +3748,11 @@ my %opcodeInfo = (
|
|
3745
3748
|
},
|
3746
3749
|
0xc726 => {
|
3747
3750
|
Name => 'ProfileLookTableData',
|
3751
|
+
%longBin,
|
3748
3752
|
Writable => 'float',
|
3749
3753
|
WriteGroup => 'IFD0',
|
3750
3754
|
Count => -1,
|
3751
3755
|
Protected => 1,
|
3752
|
-
Binary => 1,
|
3753
3756
|
},
|
3754
3757
|
0xc740 => { Name => 'OpcodeList1', %opcodeInfo }, # DNG 1.3
|
3755
3758
|
0xc741 => { Name => 'OpcodeList2', %opcodeInfo }, # DNG 1.3
|
@@ -5796,7 +5799,8 @@ sub ProcessExif($$$)
|
|
5796
5799
|
$numEntries = Get16u($dataPt, $dirStart);
|
5797
5800
|
} else {
|
5798
5801
|
$et->Warn("Bad $dir directory", $inMakerNotes);
|
5799
|
-
return 0 unless $inMakerNotes and $dirLen >= 14
|
5802
|
+
return 0 unless $inMakerNotes and $dirLen >= 14 and $dirStart >= 0 and
|
5803
|
+
$dirStart + $dirLen <= length($$dataPt);
|
5800
5804
|
$dirSize = $dirLen;
|
5801
5805
|
$numEntries = int(($dirSize - 2) / 12); # read what we can
|
5802
5806
|
Set16u($numEntries, $dataPt, $dirStart);
|
@@ -5914,7 +5918,7 @@ sub ProcessExif($$$)
|
|
5914
5918
|
my $size = $count * $formatSize[$format];
|
5915
5919
|
my $readSize = $size;
|
5916
5920
|
if ($size > 4) {
|
5917
|
-
if ($size > 0x7fffffff) {
|
5921
|
+
if ($size > 0x7fffffff and (not $tagInfo or not $$tagInfo{ReadFromRAF})) {
|
5918
5922
|
$et->Warn(sprintf("Invalid size (%u) for %s %s",$size,$dir,TagName($tagID,$tagInfo)), $inMakerNotes);
|
5919
5923
|
++$warnCount;
|
5920
5924
|
next;
|
@@ -6167,17 +6171,30 @@ sub ProcessExif($$$)
|
|
6167
6171
|
unless ($bad) {
|
6168
6172
|
# limit maximum length of data to reformat
|
6169
6173
|
# (avoids long delays when processing some corrupted files)
|
6174
|
+
my $warned;
|
6170
6175
|
if ($count > 100000 and $formatStr !~ /^(undef|string|binary)$/) {
|
6171
6176
|
my $tagName = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
|
6177
|
+
# (count of 196608 is typical for ColorMap)
|
6172
6178
|
if ($tagName ne 'TransferFunction' or $count != 196608) {
|
6173
6179
|
my $minor = $count > 2000000 ? 0 : 2;
|
6174
|
-
|
6180
|
+
if ($et->Warn("Ignoring $dirName $tagName with excessive count", $minor)) {
|
6181
|
+
next unless $$et{OPTIONS}{HtmlDump};
|
6182
|
+
$warned = 1;
|
6183
|
+
}
|
6175
6184
|
}
|
6176
6185
|
}
|
6177
|
-
|
6178
|
-
|
6179
|
-
|
6180
|
-
|
6186
|
+
if ($count > 500 and $formatStr !~ /^(undef|string|binary)$/ and
|
6187
|
+
(not $tagInfo or $$tagInfo{LongBinary} or $warned) and not $$et{OPTIONS}{IgnoreMinorErrors})
|
6188
|
+
{
|
6189
|
+
$et->WarnOnce('Not decoding some large array(s). Ignore minor errors to decode', 2) unless $warned;
|
6190
|
+
next if $$et{TAGS_FROM_FILE}; # don't generate bogus value when copying tags
|
6191
|
+
$val = "(large array of $count $formatStr values)";
|
6192
|
+
} else {
|
6193
|
+
# convert according to specified format
|
6194
|
+
$val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize,\$rational);
|
6195
|
+
# re-code if necessary
|
6196
|
+
$val = $et->Decode($val, $strEnc) if $strEnc and $formatStr eq 'string' and defined $val;
|
6197
|
+
}
|
6181
6198
|
}
|
6182
6199
|
|
6183
6200
|
if ($verbose) {
|
@@ -14,7 +14,7 @@ use strict;
|
|
14
14
|
use vars qw($VERSION);
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.02';
|
18
18
|
|
19
19
|
# FITS tags (ref 1)
|
20
20
|
%Image::ExifTool::FITS::Main = (
|
@@ -36,6 +36,10 @@ $VERSION = '1.00';
|
|
36
36
|
'TIME-OBS'=> { Name => 'ObservationTime', Groups => { 2 => 'Time' } },
|
37
37
|
'DATE-END'=> { Name => 'ObservationDateEnd', Groups => { 2 => 'Time' } },
|
38
38
|
'TIME-END'=> { Name => 'ObservationTimeEnd', Groups => { 2 => 'Time' } },
|
39
|
+
COMMENT => { Name => 'Comment', PrintConv => '$val =~ s/^ +//; $val',
|
40
|
+
Notes => 'leading spaces are removed if L<PrintConv|../ExifTool.html#PrintConv> is enabled' },
|
41
|
+
HISTORY => { Name => 'History', PrintConv => '$val =~ s/^ +//; $val',
|
42
|
+
Notes => 'leading spaces are removed if L<PrintConv|../ExifTool.html#PrintConv> is enabled' },
|
39
43
|
);
|
40
44
|
|
41
45
|
#------------------------------------------------------------------------------
|
@@ -67,7 +71,14 @@ sub ProcessFITS($$)
|
|
67
71
|
last if $key eq 'END';
|
68
72
|
# make sure the key is valid
|
69
73
|
$key =~ /^[-_A-Z0-9]*$/ or $et->Warn('Format error in FITS header'), last;
|
70
|
-
|
74
|
+
if ($key eq 'COMMENT' or $key eq 'HISTORY') {
|
75
|
+
my $val = substr($buff, 8); # comments start in column 9
|
76
|
+
$val =~ s/ +$//; # remove trailing spaces
|
77
|
+
$et->HandleTag($tagTablePtr, $key, $val);
|
78
|
+
next;
|
79
|
+
}
|
80
|
+
# ignore other lines that aren't tags
|
81
|
+
next unless substr($buff,8,2) eq '= ';
|
71
82
|
# save tag name (avoiding potential conflict with ExifTool variables)
|
72
83
|
$tag = $Image::ExifTool::specialTags{$key} ? "_$key" : $key;
|
73
84
|
# add to tag table if necessary
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
use Image::ExifTool::Exif;
|
22
22
|
use Image::ExifTool::ASF; # for GetGUID()
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.39';
|
25
25
|
|
26
26
|
sub ProcessFPX($$);
|
27
27
|
sub ProcessFPXR($$$);
|
@@ -1369,29 +1369,48 @@ sub ReadFPXValue($$$$$;$$)
|
|
1369
1369
|
my $flags = $type & 0xf000;
|
1370
1370
|
if ($flags) {
|
1371
1371
|
if ($flags == VT_VECTOR) {
|
1372
|
-
$noPad = 1; # values
|
1372
|
+
$noPad = 1; # values sometimes aren't padded inside vectors!!
|
1373
1373
|
my $size = $oleFormatSize{VT_VECTOR};
|
1374
|
-
|
1374
|
+
if ($valPos + $size > $dirEnd) {
|
1375
|
+
$et->WarnOnce('Incorrect FPX VT_VECTOR size');
|
1376
|
+
last;
|
1377
|
+
}
|
1375
1378
|
$count = Get32u($dataPt, $valPos);
|
1376
1379
|
push @vals, '' if $count == 0; # allow zero-element vector
|
1377
1380
|
$valPos += 4;
|
1378
1381
|
} else {
|
1379
1382
|
# can't yet handle this property flag
|
1383
|
+
$et->WarnOnce('Unknown FPX property');
|
1380
1384
|
last;
|
1381
1385
|
}
|
1382
1386
|
}
|
1383
1387
|
unless ($format =~ /^VT_/) {
|
1384
1388
|
my $size = Image::ExifTool::FormatSize($format) * $count;
|
1385
|
-
|
1389
|
+
if ($valPos + $size > $dirEnd) {
|
1390
|
+
$et->WarnOnce("Incorrect FPX $format size");
|
1391
|
+
last;
|
1392
|
+
}
|
1386
1393
|
@vals = ReadValue($dataPt, $valPos, $format, $count, $size);
|
1387
1394
|
# update position to end of value plus padding
|
1388
1395
|
$valPos += ($count * $size + 3) & 0xfffffffc;
|
1389
1396
|
last;
|
1390
1397
|
}
|
1391
1398
|
my $size = $oleFormatSize{$format};
|
1392
|
-
my ($item, $val);
|
1399
|
+
my ($item, $val, $len);
|
1393
1400
|
for ($item=0; $item<$count; ++$item) {
|
1394
|
-
|
1401
|
+
if ($valPos + $size > $dirEnd) {
|
1402
|
+
$et->WarnOnce("Truncated FPX $format value");
|
1403
|
+
last;
|
1404
|
+
}
|
1405
|
+
# sometimes VT_VECTOR items are padded to even 4-byte boundaries, and sometimes they aren't
|
1406
|
+
if ($noPad and defined $len and $len & 0x03) {
|
1407
|
+
my $pad = 4 - ($len & 0x03);
|
1408
|
+
if ($valPos + $pad + $size <= $dirEnd) {
|
1409
|
+
# skip padding if all zeros
|
1410
|
+
$valPos += $pad if substr($$dataPt, $valPos, $pad) eq "\0" x $pad;
|
1411
|
+
}
|
1412
|
+
}
|
1413
|
+
undef $len;
|
1395
1414
|
if ($format eq 'VT_VARIANT') {
|
1396
1415
|
my $subType = Get32u($dataPt, $valPos);
|
1397
1416
|
$valPos += $size;
|
@@ -1429,9 +1448,12 @@ sub ReadFPXValue($$$$$;$$)
|
|
1429
1448
|
$val = ($val - 25569) * 24 * 3600 if $val != 0;
|
1430
1449
|
$val = Image::ExifTool::ConvertUnixTime($val);
|
1431
1450
|
} elsif ($format =~ /STR$/) {
|
1432
|
-
|
1451
|
+
$len = Get32u($dataPt, $valPos);
|
1433
1452
|
$len *= 2 if $format eq 'VT_LPWSTR'; # convert to byte count
|
1434
|
-
|
1453
|
+
if ($valPos + $len + 4 > $dirEnd) {
|
1454
|
+
$et->WarnOnce("Truncated $format value");
|
1455
|
+
last;
|
1456
|
+
}
|
1435
1457
|
$val = substr($$dataPt, $valPos + 4, $len);
|
1436
1458
|
if ($format eq 'VT_LPWSTR') {
|
1437
1459
|
# convert wide string from Unicode
|
@@ -1450,8 +1472,11 @@ sub ReadFPXValue($$$$$;$$)
|
|
1450
1472
|
# on even 32-bit boundaries, but this isn't always the case)
|
1451
1473
|
$valPos += $noPad ? $len : ($len + 3) & 0xfffffffc;
|
1452
1474
|
} elsif ($format eq 'VT_BLOB' or $format eq 'VT_CF') {
|
1453
|
-
my $len = Get32u($dataPt, $valPos);
|
1454
|
-
|
1475
|
+
my $len = Get32u($dataPt, $valPos); # (use local $len because we always expect padding)
|
1476
|
+
if ($valPos + $len + 4 > $dirEnd) {
|
1477
|
+
$et->WarnOnce("Truncated $format value");
|
1478
|
+
last;
|
1479
|
+
}
|
1455
1480
|
$val = substr($$dataPt, $valPos + 4, $len);
|
1456
1481
|
# update position for data length plus padding
|
1457
1482
|
# (does this padding disappear in arrays too?)
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
32
32
|
use Image::ExifTool::Exif;
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.80';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -489,6 +489,7 @@ my %faceCategories = (
|
|
489
489
|
3 => 'Electronic Front Curtain', #10
|
490
490
|
},
|
491
491
|
},
|
492
|
+
# 0x1100 - This may not work well for newer cameras (ref forum12682)
|
492
493
|
0x1100 => [{
|
493
494
|
Name => 'AutoBracketing',
|
494
495
|
Condition => '$$self{Model} eq "X-T3"',
|
@@ -507,6 +508,7 @@ my %faceCategories = (
|
|
507
508
|
0 => 'Off',
|
508
509
|
1 => 'On',
|
509
510
|
2 => 'No flash & flash', #3
|
511
|
+
6 => 'Pixel Shift', #IB (GFX100S)
|
510
512
|
},
|
511
513
|
}],
|
512
514
|
0x1101 => {
|
@@ -517,6 +519,8 @@ my %faceCategories = (
|
|
517
519
|
Name => 'DriveSettings',
|
518
520
|
SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::DriveSettings' },
|
519
521
|
},
|
522
|
+
0x1105 => { Name => 'PixelShiftShots', Writable => 'int16u' }, #IB
|
523
|
+
0x1106 => { Name => 'PixelShiftOffset', Writable => 'rational64s', Count => 2 }, #IB
|
520
524
|
# (0x1150-0x1152 exist only for Pro Low-light and Pro Focus PictureModes)
|
521
525
|
# 0x1150 - Pro Low-light - val=1; Pro Focus - val=2 (ref 7); HDR - val=128 (forum10799)
|
522
526
|
# 0x1151 - Pro Low-light - val=4 (number of pictures taken?); Pro Focus - val=2,3 (ref 7); HDR - val=3 (forum10799)
|
@@ -915,15 +919,22 @@ my %faceCategories = (
|
|
915
919
|
WRITABLE => 1,
|
916
920
|
0.1 => {
|
917
921
|
Name => 'FocusMode2',
|
918
|
-
Mask =>
|
922
|
+
Mask => 0x0000000f,
|
919
923
|
PrintConv => {
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
0x11 => 'AF-S (Auto)',
|
924
|
+
0x0 => 'AF-M',
|
925
|
+
0x1 => 'AF-S',
|
926
|
+
0x2 => 'AF-C',
|
924
927
|
},
|
925
928
|
},
|
926
929
|
0.2 => {
|
930
|
+
Name => 'PreAF',
|
931
|
+
Mask => 0x00f0,
|
932
|
+
PrintConv => {
|
933
|
+
0 => 'Off',
|
934
|
+
1 => 'On',
|
935
|
+
},
|
936
|
+
},
|
937
|
+
0.3 => {
|
927
938
|
Name => 'AFAreaMode',
|
928
939
|
Mask => 0x0f00,
|
929
940
|
PrintConv => {
|
@@ -932,7 +943,7 @@ my %faceCategories = (
|
|
932
943
|
2 => 'Wide/Tracking',
|
933
944
|
},
|
934
945
|
},
|
935
|
-
0.
|
946
|
+
0.4 => {
|
936
947
|
Name => 'AFAreaPointSize',
|
937
948
|
Mask => 0xf000,
|
938
949
|
PrintConv => {
|
@@ -940,7 +951,7 @@ my %faceCategories = (
|
|
940
951
|
OTHER => sub { return $_[0] },
|
941
952
|
},
|
942
953
|
},
|
943
|
-
0.
|
954
|
+
0.5 => {
|
944
955
|
Name => 'AFAreaZoneSize',
|
945
956
|
Mask => 0xf0000,
|
946
957
|
PrintConv => {
|
@@ -12,13 +12,12 @@ use strict;
|
|
12
12
|
use vars qw($VERSION);
|
13
13
|
use Image::ExifTool::Exif;
|
14
14
|
|
15
|
-
$VERSION = '1.
|
15
|
+
$VERSION = '1.53';
|
16
16
|
|
17
17
|
my %coordConv = (
|
18
18
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
|
19
19
|
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val)',
|
20
20
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
|
21
|
-
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val)',
|
22
21
|
);
|
23
22
|
|
24
23
|
%Image::ExifTool::GPS::Main = (
|
@@ -41,7 +40,7 @@ my %coordConv = (
|
|
41
40
|
Notes => q{
|
42
41
|
tags 0x0001-0x0006 used for camera location according to MWG 2.0. ExifTool
|
43
42
|
will also accept a number when writing GPSLatitudeRef, positive for north
|
44
|
-
latitudes or negative for south, or a string
|
43
|
+
latitudes or negative for south, or a string containing N, North, S or South
|
45
44
|
},
|
46
45
|
Count => 2,
|
47
46
|
PrintConv => {
|
@@ -50,7 +49,7 @@ my %coordConv = (
|
|
50
49
|
OTHER => sub {
|
51
50
|
my ($val, $inv) = @_;
|
52
51
|
return undef unless $inv;
|
53
|
-
return uc $
|
52
|
+
return uc $2 if $val =~ /(^|[^A-Z])([NS])(orth|outh)?\b/i;
|
54
53
|
return $1 eq '-' ? 'S' : 'N' if $val =~ /([-+]?)\d+/;
|
55
54
|
return undef;
|
56
55
|
},
|
@@ -63,6 +62,7 @@ my %coordConv = (
|
|
63
62
|
Writable => 'rational64u',
|
64
63
|
Count => 3,
|
65
64
|
%coordConv,
|
65
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lat")',
|
66
66
|
},
|
67
67
|
0x0003 => {
|
68
68
|
Name => 'GPSLongitudeRef',
|
@@ -70,7 +70,7 @@ my %coordConv = (
|
|
70
70
|
Count => 2,
|
71
71
|
Notes => q{
|
72
72
|
ExifTool will also accept a number when writing this tag, positive for east
|
73
|
-
longitudes or negative for west, or a string
|
73
|
+
longitudes or negative for west, or a string containing E, East, W or West
|
74
74
|
},
|
75
75
|
PrintConv => {
|
76
76
|
# extract E/W if written from Composite:GPSLongitude
|
@@ -78,7 +78,7 @@ my %coordConv = (
|
|
78
78
|
OTHER => sub {
|
79
79
|
my ($val, $inv) = @_;
|
80
80
|
return undef unless $inv;
|
81
|
-
return uc $
|
81
|
+
return uc $2 if $val =~ /(^|[^A-Z])([EW])(ast|est)?\b/i;
|
82
82
|
return $1 eq '-' ? 'W' : 'E' if $val =~ /([-+]?)\d+/;
|
83
83
|
return undef;
|
84
84
|
},
|
@@ -91,6 +91,7 @@ my %coordConv = (
|
|
91
91
|
Writable => 'rational64u',
|
92
92
|
Count => 3,
|
93
93
|
%coordConv,
|
94
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lon")',
|
94
95
|
},
|
95
96
|
0x0005 => {
|
96
97
|
Name => 'GPSAltitudeRef',
|
@@ -238,6 +239,7 @@ my %coordConv = (
|
|
238
239
|
Writable => 'rational64u',
|
239
240
|
Count => 3,
|
240
241
|
%coordConv,
|
242
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lat")',
|
241
243
|
},
|
242
244
|
0x0015 => {
|
243
245
|
Name => 'GPSDestLongitudeRef',
|
@@ -250,6 +252,7 @@ my %coordConv = (
|
|
250
252
|
Writable => 'rational64u',
|
251
253
|
Count => 3,
|
252
254
|
%coordConv,
|
255
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lon")',
|
253
256
|
},
|
254
257
|
0x0017 => {
|
255
258
|
Name => 'GPSDestBearingRef',
|
@@ -529,18 +532,26 @@ sub ToDMS($$;$$)
|
|
529
532
|
#------------------------------------------------------------------------------
|
530
533
|
# Convert to decimal degrees
|
531
534
|
# Inputs: 0) a string containing 1-3 decimal numbers and any amount of other garbage
|
532
|
-
# 1) true if value should be negative if coordinate ends in 'S' or 'W'
|
533
|
-
#
|
534
|
-
|
535
|
+
# 1) true if value should be negative if coordinate ends in 'S' or 'W',
|
536
|
+
# 2) 'lat' or 'lon' to extract lat or lon from GPSCoordinates string
|
537
|
+
# Returns: Coordinate in degrees, or '' on error
|
538
|
+
sub ToDegrees($;$$)
|
535
539
|
{
|
536
|
-
my ($val, $doSign) = @_;
|
540
|
+
my ($val, $doSign, $coord) = @_;
|
537
541
|
return '' if $val =~ /\b(inf|undef)\b/; # ignore invalid values
|
542
|
+
# use only lat or lon part of combined GPSCoordinates inputs
|
543
|
+
if ($coord and ($coord eq 'lat' or $coord eq 'lon') and
|
544
|
+
# (two formatted coordinate values with cardinal directions, separated by a comma)
|
545
|
+
$val =~ /^(.*(?:N(?:orth)?|S(?:outh)?)),\s*(.*(?:E(?:ast)?|W(?:est)?))$/i)
|
546
|
+
{
|
547
|
+
$val = $coord eq 'lat' ? $1 : $2;
|
548
|
+
}
|
538
549
|
# extract decimal or floating point values out of any other garbage
|
539
550
|
my ($d, $m, $s) = ($val =~ /((?:[+-]?)(?=\d|\.\d)\d*(?:\.\d*)?(?:[Ee][+-]\d+)?)/g);
|
540
551
|
return '' unless defined $d;
|
541
552
|
my $deg = $d + (($m || 0) + ($s || 0)/60) / 60;
|
542
553
|
# make negative if S or W coordinate
|
543
|
-
$deg = -$deg if $doSign ? $val =~ /[^A-Z](S
|
554
|
+
$deg = -$deg if $doSign ? $val =~ /[^A-Z](S(outh)?|W(est)?)\s*$/i : $deg < 0;
|
544
555
|
return $deg;
|
545
556
|
}
|
546
557
|
|
@@ -28,7 +28,7 @@ use vars qw($VERSION);
|
|
28
28
|
use Image::ExifTool qw(:Public);
|
29
29
|
use Image::ExifTool::GPS;
|
30
30
|
|
31
|
-
$VERSION = '1.
|
31
|
+
$VERSION = '1.65';
|
32
32
|
|
33
33
|
sub JITTER() { return 2 } # maximum time jitter
|
34
34
|
|
@@ -262,8 +262,10 @@ sub LoadTrackLog($$;$)
|
|
262
262
|
$param = 'time';
|
263
263
|
} elsif (/^(Pos)?Lat/i) {
|
264
264
|
$param = 'lat';
|
265
|
+
/ref$/i and $param .= 'ref';
|
265
266
|
} elsif (/^(Pos)?Lon/i) {
|
266
267
|
$param = 'lon';
|
268
|
+
/ref$/i and $param .= 'ref';
|
267
269
|
} elsif (/^(Pos)?Alt/i) {
|
268
270
|
$param = 'alt';
|
269
271
|
} elsif (/^(Angle)?(Heading|Track)/i) {
|
@@ -453,7 +455,7 @@ DoneFix: $isDate = 1;
|
|
453
455
|
# (ExifTool enhancements allow for standard tag names or descriptions as the column headings,
|
454
456
|
# add support for time zones and flexible coordinates, and allow new DateTime and Shift columns)
|
455
457
|
#
|
456
|
-
my ($param, $date, $secs);
|
458
|
+
my ($param, $date, $secs, %neg);
|
457
459
|
foreach $param (@csvHeadings) {
|
458
460
|
my $val = shift @vals;
|
459
461
|
last unless defined $val;
|
@@ -479,6 +481,10 @@ DoneFix: $isDate = 1;
|
|
479
481
|
}
|
480
482
|
} elsif ($param eq 'lat' or $param eq 'lon') {
|
481
483
|
$$fix{$param} = Image::ExifTool::GPS::ToDegrees($val, 1);
|
484
|
+
} elsif ($param eq 'latref') {
|
485
|
+
$neg{lat} = 1 if $val =~ /^S/i;
|
486
|
+
} elsif ($param eq 'lonref') {
|
487
|
+
$neg{lon} = 1 if $val =~ /^W/i;
|
482
488
|
} elsif ($param eq 'runtime') {
|
483
489
|
$date = $trackTime;
|
484
490
|
$secs = $val;
|
@@ -486,6 +492,11 @@ DoneFix: $isDate = 1;
|
|
486
492
|
$$fix{$param} = $val;
|
487
493
|
}
|
488
494
|
}
|
495
|
+
# make coordinate negative according to reference direction if necessary
|
496
|
+
foreach $param (keys %neg) {
|
497
|
+
next unless defined $$fix{$param};
|
498
|
+
$$fix{$param} = -abs($$fix{$param});
|
499
|
+
}
|
489
500
|
if ($date and defined $secs and defined $$fix{lat} and defined $$fix{lon}) {
|
490
501
|
$time = $date + $secs;
|
491
502
|
$$has{alt} = 1 if defined $$fix{alt};
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::QuickTime;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.07';
|
20
20
|
|
21
21
|
sub ProcessGoPro($$$);
|
22
22
|
sub ProcessString($$$);
|
@@ -386,6 +386,21 @@ my %addUnits = (
|
|
386
386
|
Binary => 1,
|
387
387
|
},
|
388
388
|
# ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max)
|
389
|
+
# the following ref forum12825
|
390
|
+
MUID => {
|
391
|
+
Name => 'MediaUniqueID',
|
392
|
+
PrintConv => q{
|
393
|
+
my @a = split ' ', $val;
|
394
|
+
$_ = sprintf('%.8x',$_) foreach @a;
|
395
|
+
return join('', @a);
|
396
|
+
},
|
397
|
+
},
|
398
|
+
EXPT => 'MaximumShutterAngle',
|
399
|
+
MTRX => 'AccelerometerMatrix',
|
400
|
+
ORIN => 'InputOrientation',
|
401
|
+
ORIO => 'OutputOrientation',
|
402
|
+
UNIF => 'InputUniformity',
|
403
|
+
SROT => 'SensorReadoutTime',
|
389
404
|
);
|
390
405
|
|
391
406
|
# GoPro GPS5 tags (ref 2) (Hero5,Hero6)
|
@@ -24,7 +24,7 @@ use strict;
|
|
24
24
|
use vars qw($VERSION);
|
25
25
|
use Image::ExifTool qw(:DataAccess :Utils);
|
26
26
|
|
27
|
-
$VERSION = '1.
|
27
|
+
$VERSION = '1.36';
|
28
28
|
|
29
29
|
sub ProcessICC($$);
|
30
30
|
sub ProcessICC_Profile($$$);
|
@@ -1225,7 +1225,7 @@ sub ProcessICC_Profile($$$)
|
|
1225
1225
|
my $type = substr($$dataPt, $valuePtr, 4);
|
1226
1226
|
#### eval Validate ($type)
|
1227
1227
|
if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
|
1228
|
-
$et->Warn("Invalid $name data");
|
1228
|
+
$et->Warn("Invalid ICC $name data");
|
1229
1229
|
} else {
|
1230
1230
|
$et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
|
1231
1231
|
}
|
@@ -18,11 +18,12 @@ use strict;
|
|
18
18
|
use vars qw($VERSION);
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.57';
|
22
22
|
|
23
23
|
sub ProcessID3v2($$$);
|
24
24
|
sub ProcessPrivate($$$);
|
25
25
|
sub ProcessSynText($$$);
|
26
|
+
sub ProcessID3Dir($$$);
|
26
27
|
sub ConvertID3v1Text($$);
|
27
28
|
sub ConvertTimeStamp($);
|
28
29
|
|
@@ -69,9 +70,10 @@ my %dateTimeConv = (
|
|
69
70
|
# This table is just for documentation purposes
|
70
71
|
%Image::ExifTool::ID3::Main = (
|
71
72
|
VARS => { NO_ID => 1 },
|
73
|
+
PROCESS_PROC => \&ProcessID3Dir, # (used to process 'id3 ' chunk in WAV files)
|
72
74
|
NOTES => q{
|
73
|
-
ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG,
|
74
|
-
FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
75
|
+
ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF,
|
76
|
+
OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
75
77
|
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
76
78
|
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
77
79
|
"Comment-spa"). See L<http://www.id3.org/> for the official ID3
|
@@ -1570,6 +1572,16 @@ sub ProcessID3($$)
|
|
1570
1572
|
return $rtnVal;
|
1571
1573
|
}
|
1572
1574
|
|
1575
|
+
#------------------------------------------------------------------------------
|
1576
|
+
# Process ID3 directory
|
1577
|
+
# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) dummy tag table ref
|
1578
|
+
sub ProcessID3Dir($$$)
|
1579
|
+
{
|
1580
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
1581
|
+
$et->VerboseDir('ID3', undef, length ${$$dirInfo{DataPt}});
|
1582
|
+
return ProcessID3($et, $dirInfo);
|
1583
|
+
}
|
1584
|
+
|
1573
1585
|
#------------------------------------------------------------------------------
|
1574
1586
|
# Extract ID3 information from an MP3 audio file
|
1575
1587
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|