exiftool_vendored 12.41.0 → 12.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Changes +209 -6
- data/bin/MANIFEST +12 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +45 -44
- data/bin/config_files/acdsee.config +2 -1
- data/bin/config_files/frameCount.config +56 -0
- data/bin/config_files/tiff_version.config +1 -1
- data/bin/exiftool +115 -96
- data/bin/fmt_files/gpx.fmt +3 -0
- data/bin/fmt_files/gpx_wpt.fmt +3 -0
- data/bin/lib/Image/ExifTool/Apple.pm +16 -3
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
- data/bin/lib/Image/ExifTool/Canon.pm +71 -33
- data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
- data/bin/lib/Image/ExifTool/DJI.pm +60 -1
- data/bin/lib/Image/ExifTool/DNG.pm +8 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
- data/bin/lib/Image/ExifTool/EXE.pm +9 -1
- data/bin/lib/Image/ExifTool/Exif.pm +26 -12
- data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
- data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
- data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
- data/bin/lib/Image/ExifTool/GPS.pm +21 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +12 -9
- data/bin/lib/Image/ExifTool/ICO.pm +143 -0
- data/bin/lib/Image/ExifTool/ID3.pm +11 -11
- data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
- data/bin/lib/Image/ExifTool/LNK.pm +5 -2
- data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MISB.pm +494 -0
- data/bin/lib/Image/ExifTool/MakerNotes.pm +8 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
- data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +293 -122
- data/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
- data/bin/lib/Image/ExifTool/Olympus.pm +22 -2
- data/bin/lib/Image/ExifTool/PDF.pm +2 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +30 -4
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
- data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +35 -8
- data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
- data/bin/lib/Image/ExifTool/README +13 -3
- data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
- data/bin/lib/Image/ExifTool/Samsung.pm +234 -3
- data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
- data/bin/lib/Image/ExifTool/Sony.pm +71 -43
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4752 -4516
- data/bin/lib/Image/ExifTool/TagNames.pod +1885 -1434
- data/bin/lib/Image/ExifTool/Text.pm +3 -4
- data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
- data/bin/lib/Image/ExifTool/Validate.pm +3 -3
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
- data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
- data/bin/lib/Image/ExifTool/Writer.pl +14 -6
- data/bin/lib/Image/ExifTool/XMP.pm +78 -59
- data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
- data/bin/lib/Image/ExifTool.pm +120 -33
- data/bin/lib/Image/ExifTool.pod +83 -69
- data/bin/perl-Image-ExifTool.spec +43 -43
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +9 -4
@@ -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.41';
|
25
25
|
|
26
26
|
sub ProcessFPX($$);
|
27
27
|
sub ProcessFPXR($$$);
|
@@ -298,6 +298,7 @@ my %fpxFileType = (
|
|
298
298
|
%Image::ExifTool::FlashPix::Main = (
|
299
299
|
PROCESS_PROC => \&ProcessFPXR,
|
300
300
|
GROUPS => { 2 => 'Image' },
|
301
|
+
VARS => { LONG_TAGS => 0 },
|
301
302
|
NOTES => q{
|
302
303
|
The FlashPix file format, introduced in 1996, was developed by Kodak,
|
303
304
|
Hewlett-Packard and Microsoft. Internally the FPX file structure mimics
|
@@ -467,6 +468,25 @@ my %fpxFileType = (
|
|
467
468
|
ByteOrder => 'BigEndian',
|
468
469
|
},
|
469
470
|
},
|
471
|
+
# recognize Autodesk Revit files by looking at BasicFileInfo
|
472
|
+
# (but don't yet support reading their metatdata)
|
473
|
+
BasicFileInfo => {
|
474
|
+
Name => 'BasicFileInfo',
|
475
|
+
Binary => 1,
|
476
|
+
RawConv => q{
|
477
|
+
$val =~ tr/\0//d; # brute force conversion to ASCII
|
478
|
+
if ($val =~ /\.(rfa|rft|rte|rvt)/) {
|
479
|
+
$self->OverrideFileType(uc($1), "application/$1", $1);
|
480
|
+
}
|
481
|
+
return $val;
|
482
|
+
},
|
483
|
+
},
|
484
|
+
IeImg => {
|
485
|
+
Name => 'EmbeddedImage',
|
486
|
+
Notes => 'embedded images in Scene7 vignette VNT files',
|
487
|
+
Groups => { 2 => 'Preview' },
|
488
|
+
Binary => 1,
|
489
|
+
},
|
470
490
|
);
|
471
491
|
|
472
492
|
# Summary Information properties
|
@@ -1318,7 +1338,9 @@ sub ConvertDTTM($)
|
|
1318
1338
|
my $hr = ($val >> 6) & 0x1f;
|
1319
1339
|
my $min = ($val & 0x3f);
|
1320
1340
|
$yr += 1900 if $val;
|
1321
|
-
|
1341
|
+
# ExifTool 12.48 dropped the "Z" on the time here because a test .doc
|
1342
|
+
# file written by Word 2011 on Mac certainly used local time here
|
1343
|
+
return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:00",$yr,$mon,$day,$hr,$min);
|
1322
1344
|
}
|
1323
1345
|
|
1324
1346
|
#------------------------------------------------------------------------------
|
@@ -2242,7 +2264,8 @@ sub ProcessFPX($$)
|
|
2242
2264
|
# remove instance number or class ID from tag if necessary
|
2243
2265
|
$tagInfo = $et->GetTagInfo($tagTablePtr, $1) if
|
2244
2266
|
($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
|
2245
|
-
($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1})
|
2267
|
+
($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1}) or
|
2268
|
+
($tag =~ /(.*)_[0-9]{4}$/s and $$tagTablePtr{$1}); # IeImg instances
|
2246
2269
|
}
|
2247
2270
|
|
2248
2271
|
my $lSib = Get32u(\$dir, $pos + 0x44); # left sibling
|
@@ -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.84';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -254,6 +254,23 @@ my %faceCategories = (
|
|
254
254
|
0x2e0 => '-4 (weakest)', #10 (-4)
|
255
255
|
},
|
256
256
|
},
|
257
|
+
0x100f => { #PR158
|
258
|
+
Name => 'Clarity',
|
259
|
+
Writable => 'int32s', #PH
|
260
|
+
PrintConv => {
|
261
|
+
-5000 => '-5',
|
262
|
+
-4000 => '-4',
|
263
|
+
-3000 => '-3',
|
264
|
+
-2000 => '-2',
|
265
|
+
-1000 => '-1',
|
266
|
+
0 => '0',
|
267
|
+
1000 => '1',
|
268
|
+
2000 => '2',
|
269
|
+
3000 => '3',
|
270
|
+
4000 => '4',
|
271
|
+
5000 => '5',
|
272
|
+
},
|
273
|
+
},
|
257
274
|
0x1010 => {
|
258
275
|
Name => 'FujiFlashMode',
|
259
276
|
Writable => 'int16u',
|
@@ -444,7 +461,7 @@ my %faceCategories = (
|
|
444
461
|
PrintConv => { 0 => 'Off', 1 => 'On' },
|
445
462
|
},
|
446
463
|
0x1047 => { #12
|
447
|
-
Name => '
|
464
|
+
Name => 'GrainEffectRoughness',
|
448
465
|
Writable => 'int32s',
|
449
466
|
PrintConv => {
|
450
467
|
0 => 'Off',
|
@@ -469,6 +486,15 @@ my %faceCategories = (
|
|
469
486
|
PrintConvInv => '$val + 0',
|
470
487
|
},
|
471
488
|
# 0x104b - BWAdjustment for Green->Magenta (forum10800)
|
489
|
+
0x104c => { #PR158
|
490
|
+
Name => "GrainEffectSize",
|
491
|
+
Writable => 'int16u', #PH
|
492
|
+
PrintConv => {
|
493
|
+
0 => 'Off',
|
494
|
+
16 => 'Small',
|
495
|
+
32 => 'Large',
|
496
|
+
},
|
497
|
+
},
|
472
498
|
0x104d => { #forum9634
|
473
499
|
Name => 'CropMode',
|
474
500
|
Writable => 'int16u',
|
@@ -689,8 +715,9 @@ my %faceCategories = (
|
|
689
715
|
PrintConv => [{
|
690
716
|
0 => 'None',
|
691
717
|
1 => 'Optical', #PH
|
692
|
-
2 => 'Sensor-shift', #PH
|
718
|
+
2 => 'Sensor-shift', #PH (now IBIS/OIS, ref forum13708)
|
693
719
|
3 => 'OIS Lens', #forum9815 (optical+sensor?)
|
720
|
+
258 => 'IBIS/OIS + DIS', #forum13708 (digital on top of IBIS/OIS)
|
694
721
|
512 => 'Digital', #PH
|
695
722
|
},{
|
696
723
|
0 => 'Off',
|
@@ -762,6 +789,8 @@ my %faceCategories = (
|
|
762
789
|
},
|
763
790
|
PrintConvInv => '$val=~/(0x[0-9a-f]+)/i; hex $1',
|
764
791
|
},
|
792
|
+
0x1447 => { Name => 'FujiModel', Writable => 'string' },
|
793
|
+
0x1448 => { Name => 'FujiModel2', Writable => 'string' },
|
765
794
|
0x3803 => { #forum10037
|
766
795
|
Name => 'VideoRecordingMode',
|
767
796
|
Groups => { 2 => 'Video' },
|
@@ -841,6 +870,24 @@ my %faceCategories = (
|
|
841
870
|
1 => 'Face',
|
842
871
|
2 => 'Left Eye',
|
843
872
|
3 => 'Right Eye',
|
873
|
+
7 => 'Body',
|
874
|
+
8 => 'Head',
|
875
|
+
11 => 'Bike',
|
876
|
+
12 => 'Body of Car',
|
877
|
+
13 => 'Front of Car',
|
878
|
+
14 => 'Animal Body',
|
879
|
+
15 => 'Animal Head',
|
880
|
+
16 => 'Animal Face',
|
881
|
+
17 => 'Animal Left Eye',
|
882
|
+
18 => 'Animal Right Eye',
|
883
|
+
19 => 'Bird Body',
|
884
|
+
20 => 'Bird Head',
|
885
|
+
21 => 'Bird Left Eye',
|
886
|
+
22 => 'Bird Right Eye',
|
887
|
+
23 => 'Aircraft Body',
|
888
|
+
25 => 'Aircraft Cockpit',
|
889
|
+
26 => 'Train Front',
|
890
|
+
27 => 'Train Cockpit',
|
844
891
|
},'REPEAT'],
|
845
892
|
},
|
846
893
|
# 0x4202 int8u[-1] - number of cooredinates in each rectangle? (ref 11)
|
@@ -1025,7 +1072,7 @@ my %faceCategories = (
|
|
1025
1072
|
Mask => 0x000000ff,
|
1026
1073
|
PrintConv => {
|
1027
1074
|
0 => 'Single',
|
1028
|
-
1 => 'Continuous Low',
|
1075
|
+
1 => 'Continuous Low', # not used by X-H2S? (see forum13777)
|
1029
1076
|
2 => 'Continuous High',
|
1030
1077
|
},
|
1031
1078
|
},
|
@@ -12,7 +12,7 @@ use strict;
|
|
12
12
|
use vars qw($VERSION);
|
13
13
|
use Image::ExifTool::Exif;
|
14
14
|
|
15
|
-
$VERSION = '1.
|
15
|
+
$VERSION = '1.54';
|
16
16
|
|
17
17
|
my %coordConv = (
|
18
18
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
|
@@ -360,21 +360,41 @@ my %coordConv = (
|
|
360
360
|
# which must therefore require this module as necessary
|
361
361
|
GPSLatitude => {
|
362
362
|
SubDoc => 1, # generate for all sub-documents
|
363
|
+
Writable => 1,
|
364
|
+
Avoid => 1,
|
365
|
+
Priority => 1, # (necessary because Avoid sets default Priority to 0)
|
363
366
|
Require => {
|
364
367
|
0 => 'GPS:GPSLatitude',
|
365
368
|
1 => 'GPS:GPSLatitudeRef',
|
366
369
|
},
|
370
|
+
WriteAlso => {
|
371
|
+
'GPS:GPSLatitude' => '$val',
|
372
|
+
'GPS:GPSLatitudeRef' => '(defined $val and $val < 0) ? "S" : "N"',
|
373
|
+
},
|
367
374
|
ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]',
|
368
375
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
376
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
|
369
377
|
},
|
370
378
|
GPSLongitude => {
|
371
379
|
SubDoc => 1, # generate for all sub-documents
|
380
|
+
Writable => 1,
|
381
|
+
Avoid => 1,
|
382
|
+
Priority => 1,
|
383
|
+
Require => {
|
384
|
+
0 => 'GPS:GPSLongitude',
|
385
|
+
1 => 'GPS:GPSLongitudeRef',
|
386
|
+
},
|
387
|
+
WriteAlso => {
|
388
|
+
'GPS:GPSLongitude' => '$val',
|
389
|
+
'GPS:GPSLongitudeRef' => '(defined $val and $val < 0) ? "W" : "E"',
|
390
|
+
},
|
372
391
|
Require => {
|
373
392
|
0 => 'GPS:GPSLongitude',
|
374
393
|
1 => 'GPS:GPSLongitudeRef',
|
375
394
|
},
|
376
395
|
ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]',
|
377
396
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
397
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
|
378
398
|
},
|
379
399
|
GPSAltitude => {
|
380
400
|
SubDoc => [1,3], # generate for sub-documents if Desire 1 or 3 has a chance to exist
|
@@ -14,6 +14,7 @@
|
|
14
14
|
# 2019/07/02 - PH Added ability to read IMU CSV files
|
15
15
|
# 2019/11/10 - PH Also write pitch to CameraElevationAngle
|
16
16
|
# 2020/12/01 - PH Added ability to read DJI CSV log files
|
17
|
+
# 2022/06/21 - PH Added ability to read Google Takeout JSON files
|
17
18
|
#
|
18
19
|
# References: 1) http://www.topografix.com/GPX/1/1/
|
19
20
|
# 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
|
@@ -28,7 +29,7 @@ use vars qw($VERSION);
|
|
28
29
|
use Image::ExifTool qw(:Public);
|
29
30
|
use Image::ExifTool::GPS;
|
30
31
|
|
31
|
-
$VERSION = '1.
|
32
|
+
$VERSION = '1.68';
|
32
33
|
|
33
34
|
sub JITTER() { return 2 } # maximum time jitter
|
34
35
|
|
@@ -133,7 +134,7 @@ sub LoadTrackLog($$;$)
|
|
133
134
|
local ($_, $/, *EXIFTOOL_TRKFILE);
|
134
135
|
my ($et, $val) = @_;
|
135
136
|
my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
|
136
|
-
my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings);
|
137
|
+
my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings, $sortFixes);
|
137
138
|
my ($canCut, $cutPDOP, $cutHDOP, $cutSats, $e0, $e1, @tmp, $trackFile, $trackTime);
|
138
139
|
|
139
140
|
unless (eval { require Time::Local }) {
|
@@ -285,6 +286,10 @@ sub LoadTrackLog($$;$)
|
|
285
286
|
}
|
286
287
|
}
|
287
288
|
next;
|
289
|
+
} elsif (/"(timelineObjects|placeVisit|activitySegment|latitudeE7)":/) {
|
290
|
+
# Google Takeout JSON format
|
291
|
+
$format = 'JSON';
|
292
|
+
$sortFixes = 1; # (fixes are not all in order for this format)
|
288
293
|
} else {
|
289
294
|
# search only first 50 lines of file for a valid fix
|
290
295
|
last if ++$skipped > 50;
|
@@ -506,6 +511,19 @@ DoneFix: $isDate = 1;
|
|
506
511
|
goto DoneFix;
|
507
512
|
}
|
508
513
|
next;
|
514
|
+
} elsif ($format eq 'JSON') {
|
515
|
+
# Google Takeout JSON format
|
516
|
+
if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp)":\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
|
517
|
+
if ($1 eq 'timestamp') {
|
518
|
+
$time = GetTime($2);
|
519
|
+
goto DoneFix if $time and $$fix{lat} and $$fix{lon};
|
520
|
+
} elsif ($1 eq 'latitudeE7' or $1 eq 'latE7') {
|
521
|
+
$$fix{lat} = $2 * 1e-7;
|
522
|
+
} else {
|
523
|
+
$$fix{lon} = $2 * 1e-7;
|
524
|
+
}
|
525
|
+
}
|
526
|
+
next;
|
509
527
|
}
|
510
528
|
my (%fix, $secs, $date, $nmea);
|
511
529
|
if ($format eq 'NMEA') {
|
@@ -540,7 +558,7 @@ DoneFix: $isDate = 1;
|
|
540
558
|
} elsif ($nmea eq 'RMC') {
|
541
559
|
# $GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25
|
542
560
|
# $GPRMC,093657.007,,3652.835020,N,01053.104094,E,1.642,,290913,,,A*0F
|
543
|
-
# $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,
|
561
|
+
# $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,dddmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs
|
544
562
|
/^\$[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next;
|
545
563
|
next if $13 > 31 or $14 > 12 or $15 > 99; # validate day/month/year
|
546
564
|
$fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1);
|
@@ -751,6 +769,8 @@ DoneFix: $isDate = 1;
|
|
751
769
|
$numPoints -= $cutHDOP;
|
752
770
|
$numPoints -= $cutSats;
|
753
771
|
}
|
772
|
+
# sort fixes if necessary
|
773
|
+
@fixTimes = sort { $a <=> $b } @fixTimes if $sortFixes;
|
754
774
|
# mark first fix of the track
|
755
775
|
while (@fixTimes) {
|
756
776
|
$fix = $$points{$fixTimes[0]} or shift(@fixTimes), next;
|
@@ -1409,8 +1429,8 @@ This module is used by Image::ExifTool
|
|
1409
1429
|
This module loads GPS track logs, interpolates to determine position based
|
1410
1430
|
on time, and sets new GPS values for geotagging images. Currently supported
|
1411
1431
|
formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan
|
1412
|
-
PMGNTRK, Honeywell PTNTHPR, Winplus Beacon text,
|
1413
|
-
|
1432
|
+
PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus Beacon text, Google Takeout
|
1433
|
+
JSON, GPS/IMU CSV, DJI CSV, ExifTool CSV log files.
|
1414
1434
|
|
1415
1435
|
Methods in this module should not be called directly. Instead, the Geotag
|
1416
1436
|
feature is accessed by writing the values of the ExifTool Geotag, Geosync
|
@@ -25,7 +25,7 @@ use strict;
|
|
25
25
|
use vars qw($VERSION);
|
26
26
|
use Image::ExifTool qw(:DataAccess :Utils);
|
27
27
|
|
28
|
-
$VERSION = '1.
|
28
|
+
$VERSION = '1.40';
|
29
29
|
|
30
30
|
sub ProcessICC($$);
|
31
31
|
sub ProcessICC_Profile($$$);
|
@@ -522,11 +522,11 @@ my %manuSig = ( #6
|
|
522
522
|
prmg => 'Perceptual Reference Medium Gamut',
|
523
523
|
},
|
524
524
|
},
|
525
|
-
meta => { #5
|
525
|
+
meta => { #5
|
526
526
|
Name => 'Metadata',
|
527
527
|
SubDirectory => {
|
528
528
|
TagTable => 'Image::ExifTool::ICC_Profile::Metadata',
|
529
|
-
Validate => '$type eq "
|
529
|
+
Validate => '$type eq "dict"',
|
530
530
|
},
|
531
531
|
},
|
532
532
|
|
@@ -627,7 +627,7 @@ my %manuSig = ( #6
|
|
627
627
|
swpt => 'SpectralWhitePoint',
|
628
628
|
s2cp => 'StandardToCustomPcc',
|
629
629
|
smap => 'SurfaceMap',
|
630
|
-
# smwp ? (seen in some v5 samples)
|
630
|
+
# smwp ? (seen in some v5 samples [was a mistake in sample production])
|
631
631
|
|
632
632
|
# the following entry represents the ICC profile header, and doesn't
|
633
633
|
# exist as a tag in the directory. It is only in this table to provide
|
@@ -815,6 +815,7 @@ my %manuSig = ( #6
|
|
815
815
|
Name => 'ChromaticityColorant',
|
816
816
|
Format => 'int16u',
|
817
817
|
PrintConv => {
|
818
|
+
0 => 'Unknown',
|
818
819
|
1 => 'ITU-R BT.709',
|
819
820
|
2 => 'SMPTE RP145-1994',
|
820
821
|
3 => 'EBU Tech.3213-E',
|
@@ -891,6 +892,7 @@ my %manuSig = ( #6
|
|
891
892
|
ManufacturerName => { },
|
892
893
|
MediaColor => { },
|
893
894
|
MediaWeight => { },
|
895
|
+
CreatorApp => { },
|
894
896
|
);
|
895
897
|
|
896
898
|
#------------------------------------------------------------------------------
|
@@ -1000,7 +1002,7 @@ sub FormatICCTag($$$)
|
|
1000
1002
|
}
|
1001
1003
|
|
1002
1004
|
#------------------------------------------------------------------------------
|
1003
|
-
# Process ICC metadata record (ref 5)
|
1005
|
+
# Process ICC metadata record (ref 5)
|
1004
1006
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
1005
1007
|
# Returns: 1 on success
|
1006
1008
|
sub ProcessMetadata($$$)
|
@@ -1032,7 +1034,7 @@ sub ProcessMetadata($$$)
|
|
1032
1034
|
my $namePtr = Get32u($dataPt, $entry);
|
1033
1035
|
my $nameLen = Get32u($dataPt, $entry + 4);
|
1034
1036
|
my $valuePtr = Get32u($dataPt, $entry + 8);
|
1035
|
-
my $valueLen = Get32u($dataPt, $entry +
|
1037
|
+
my $valueLen = Get32u($dataPt, $entry + 12);
|
1036
1038
|
next unless $namePtr and $valuePtr; # ignore if offsets are zero
|
1037
1039
|
if ($namePtr < $minPtr or $namePtr + $nameLen > $dirLen or
|
1038
1040
|
$valuePtr < $minPtr or $valuePtr + $valueLen > $dirLen)
|
@@ -1040,8 +1042,8 @@ sub ProcessMetadata($$$)
|
|
1040
1042
|
$et->Warn('Corrupted ICC meta dictionary');
|
1041
1043
|
last;
|
1042
1044
|
}
|
1043
|
-
my $tag = substr(
|
1044
|
-
my $val = substr(
|
1045
|
+
my $tag = substr($$dataPt, $dirStart + $namePtr, $nameLen);
|
1046
|
+
my $val = substr($$dataPt, $dirStart + $valuePtr, $valueLen);
|
1045
1047
|
$tag = $et->Decode($tag, 'UTF16', 'MM', 'UTF8');
|
1046
1048
|
$val = $et->Decode($val, 'UTF16', 'MM');
|
1047
1049
|
# generate tagInfo if it doesn't exist
|
@@ -1050,6 +1052,7 @@ sub ProcessMetadata($$$)
|
|
1050
1052
|
$name =~ s/\s+(.)/\u$1/g;
|
1051
1053
|
$name =~ tr/-_a-zA-Z0-9//dc;
|
1052
1054
|
next unless length $name;
|
1055
|
+
$et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
|
1053
1056
|
AddTagToTable($tagTablePtr, $tag, { Name => $name });
|
1054
1057
|
}
|
1055
1058
|
$et->HandleTag($tagTablePtr, $tag, $val);
|
@@ -1312,7 +1315,7 @@ sub ProcessICC_Profile($$$)
|
|
1312
1315
|
DirName => $name,
|
1313
1316
|
Parent => $$dirInfo{DirName},
|
1314
1317
|
);
|
1315
|
-
my $type =
|
1318
|
+
my $type = $fmt;
|
1316
1319
|
#### eval Validate ($type)
|
1317
1320
|
if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
|
1318
1321
|
$et->Warn("Invalid ICC $name data");
|
@@ -0,0 +1,143 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# File: ICO.pm
|
3
|
+
#
|
4
|
+
# Description: Read Windows ICO and CUR files
|
5
|
+
#
|
6
|
+
# Revisions: 2020-10-18 - P. Harvey Created
|
7
|
+
#
|
8
|
+
# References: 1) https://docs.fileformat.com/image/ico/
|
9
|
+
#------------------------------------------------------------------------------
|
10
|
+
|
11
|
+
package Image::ExifTool::ICO;
|
12
|
+
|
13
|
+
use strict;
|
14
|
+
use vars qw($VERSION);
|
15
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
16
|
+
|
17
|
+
$VERSION = '1.00';
|
18
|
+
|
19
|
+
%Image::ExifTool::ICO::Main = (
|
20
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
21
|
+
GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
|
22
|
+
NOTES => 'Information extracted from Windows ICO (icon) and CUR (cursor) files.',
|
23
|
+
2 => {
|
24
|
+
Name => 'ImageType',
|
25
|
+
Format => 'int16u',
|
26
|
+
PrintConv => { 1 => 'Icon', 2 => 'Cursor' },
|
27
|
+
},
|
28
|
+
4 => {
|
29
|
+
Name => 'ImageCount',
|
30
|
+
Format => 'int16u',
|
31
|
+
RawConv => '$$self{ImageCount} = $val',
|
32
|
+
},
|
33
|
+
6 => {
|
34
|
+
Name => 'IconDir',
|
35
|
+
SubDirectory => { TagTable => 'Image::ExifTool::ICO::IconDir' },
|
36
|
+
},
|
37
|
+
);
|
38
|
+
|
39
|
+
%Image::ExifTool::ICO::IconDir = (
|
40
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
41
|
+
GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
|
42
|
+
0 => {
|
43
|
+
Name => 'ImageWidth',
|
44
|
+
ValueConv => '$val or $val + 256',
|
45
|
+
},
|
46
|
+
1 => {
|
47
|
+
Name => 'ImageHeight',
|
48
|
+
ValueConv => '$val or $val + 256',
|
49
|
+
},
|
50
|
+
2 => 'NumColors',
|
51
|
+
4 => [{
|
52
|
+
Name => 'ColorPlanes',
|
53
|
+
Condition => '$$self{FileType} eq "ICO"',
|
54
|
+
Format => 'int16u',
|
55
|
+
Notes => 'ICO files',
|
56
|
+
},{
|
57
|
+
Name => 'HotspotX',
|
58
|
+
Format => 'int16u',
|
59
|
+
Notes => 'CUR files',
|
60
|
+
}],
|
61
|
+
6 => [{
|
62
|
+
Name => 'BitsPerPixel',
|
63
|
+
Condition => '$$self{FileType} eq "ICO"',
|
64
|
+
Format => 'int16u',
|
65
|
+
Notes => 'ICO files',
|
66
|
+
},{
|
67
|
+
Name => 'HotspotY',
|
68
|
+
Format => 'int16u',
|
69
|
+
Notes => 'CUR files',
|
70
|
+
}],
|
71
|
+
8 => {
|
72
|
+
Name => 'ImageLength',
|
73
|
+
Format => 'int32u',
|
74
|
+
},
|
75
|
+
);
|
76
|
+
|
77
|
+
#------------------------------------------------------------------------------
|
78
|
+
# Process ICO/CUR file
|
79
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref
|
80
|
+
# Returns: 1 on success, 0 if this wasn't a valid ICO/CUR file
|
81
|
+
sub ProcessICO($$$)
|
82
|
+
{
|
83
|
+
my ($et, $dirInfo) = @_;
|
84
|
+
my $raf = $$dirInfo{RAF};
|
85
|
+
my ($i, $buff);
|
86
|
+
# verify this is a valid ICO/CUR file
|
87
|
+
return 0 unless $raf->Read($buff, 6) == 6;
|
88
|
+
return 0 unless $buff =~ /^\0\0([\x01\x02])\0[^0]\0/s;
|
89
|
+
# (note: have seen cursor files in the wild with an 0x01 here,
|
90
|
+
# but SetFileType will use the .cur extension to identify these)
|
91
|
+
$et->SetFileType($1 eq "\x01" ? 'ICO' : 'CUR');
|
92
|
+
SetByteOrder('II');
|
93
|
+
my $tagTbl = GetTagTable('Image::ExifTool::ICO::Main');
|
94
|
+
my $num = Get16u(\$buff, 4);
|
95
|
+
$et->HandleTag($tagTbl, 4, $num);
|
96
|
+
for ($i=0; $i<$num; ++$i) {
|
97
|
+
$raf->Read($buff, 16) == 16 or $et->Warn('Truncated file'), last;
|
98
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT} if $i;
|
99
|
+
$et->HandleTag($tagTbl, 6, $buff);
|
100
|
+
}
|
101
|
+
delete $$et{DOC_NUM};
|
102
|
+
return 1;
|
103
|
+
}
|
104
|
+
|
105
|
+
1; # end
|
106
|
+
|
107
|
+
__END__
|
108
|
+
|
109
|
+
=head1 NAME
|
110
|
+
|
111
|
+
Image::ExifTool::ICO - Read ICO meta information
|
112
|
+
|
113
|
+
=head1 SYNOPSIS
|
114
|
+
|
115
|
+
This module is used by Image::ExifTool
|
116
|
+
|
117
|
+
=head1 DESCRIPTION
|
118
|
+
|
119
|
+
This module contains definitions required by Image::ExifTool to read
|
120
|
+
information from Windows ICO (icon) and CUR (cursor) files.
|
121
|
+
|
122
|
+
=head1 AUTHOR
|
123
|
+
|
124
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
125
|
+
|
126
|
+
This library is free software; you can redistribute it and/or modify it
|
127
|
+
under the same terms as Perl itself.
|
128
|
+
|
129
|
+
=head1 REFERENCES
|
130
|
+
|
131
|
+
=over 4
|
132
|
+
|
133
|
+
=item L<https://docs.fileformat.com/image/ico/>
|
134
|
+
|
135
|
+
=back
|
136
|
+
|
137
|
+
=head1 SEE ALSO
|
138
|
+
|
139
|
+
L<Image::ExifTool::TagNames/ICO Tags>,
|
140
|
+
L<Image::ExifTool(3pm)|Image::ExifTool>
|
141
|
+
|
142
|
+
=cut
|
143
|
+
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# Revisions: 09/12/2005 - P. Harvey Created
|
7
7
|
# 09/08/2020 - PH Added Lyrics3 support
|
8
8
|
#
|
9
|
-
# References: 1) http://www.id3.org/
|
9
|
+
# References: 1) http://www.id3.org/ (now https://id3.org)
|
10
10
|
# 2) http://www.mp3-tech.org/
|
11
11
|
# 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
|
12
12
|
# 4) https://id3.org/Lyrics3
|
@@ -18,7 +18,7 @@ use strict;
|
|
18
18
|
use vars qw($VERSION);
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.58';
|
22
22
|
|
23
23
|
sub ProcessID3v2($$$);
|
24
24
|
sub ProcessPrivate($$$);
|
@@ -76,9 +76,9 @@ my %dateTimeConv = (
|
|
76
76
|
OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
77
77
|
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
78
78
|
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
79
|
-
"Comment-spa"). See L<
|
80
|
-
|
81
|
-
|
79
|
+
"Comment-spa"). See L<https://id3.org/> for the official ID3 specification
|
80
|
+
and L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of
|
81
|
+
ISO 639-2 language codes.
|
82
82
|
},
|
83
83
|
ID3v1 => {
|
84
84
|
Name => 'ID3v1',
|
@@ -1414,13 +1414,13 @@ sub ProcessID3($$)
|
|
1414
1414
|
if ($flags & 0x40) {
|
1415
1415
|
# skip the extended header
|
1416
1416
|
$size >= 4 or $et->Warn('Bad ID3 extended header'), last;
|
1417
|
-
my $len = unpack('N', $hBuff);
|
1418
|
-
if ($len > length($hBuff)
|
1417
|
+
my $len = UnSyncSafe(unpack('N', $hBuff));
|
1418
|
+
if ($len > length($hBuff)) {
|
1419
1419
|
$et->Warn('Truncated ID3 extended header');
|
1420
1420
|
last;
|
1421
1421
|
}
|
1422
|
-
$hBuff = substr($hBuff, $len
|
1423
|
-
$pos += $len
|
1422
|
+
$hBuff = substr($hBuff, $len);
|
1423
|
+
$pos += $len;
|
1424
1424
|
}
|
1425
1425
|
if ($flags & 0x10) {
|
1426
1426
|
# ignore v2.4 footer (10 bytes long)
|
@@ -1516,7 +1516,7 @@ sub ProcessID3($$)
|
|
1516
1516
|
}
|
1517
1517
|
}
|
1518
1518
|
#
|
1519
|
-
# process the
|
1519
|
+
# process the information
|
1520
1520
|
#
|
1521
1521
|
if ($rtnVal) {
|
1522
1522
|
# first process audio data if it exists
|
@@ -1661,7 +1661,7 @@ under the same terms as Perl itself.
|
|
1661
1661
|
|
1662
1662
|
=over 4
|
1663
1663
|
|
1664
|
-
=item L<
|
1664
|
+
=item L<https://id3.org/>
|
1665
1665
|
|
1666
1666
|
=item L<http://www.mp3-tech.org/>
|
1667
1667
|
|
@@ -15,7 +15,7 @@ use strict;
|
|
15
15
|
use vars qw($VERSION $AUTOLOAD %iptcCharset);
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.58';
|
19
19
|
|
20
20
|
%iptcCharset = (
|
21
21
|
"\x1b%G" => 'UTF8',
|
@@ -411,6 +411,7 @@ my %fileFormat = (
|
|
411
411
|
Shift => 'Time',
|
412
412
|
ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
|
413
413
|
ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
|
414
|
+
PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("$val 00:00:00") : $val',
|
414
415
|
PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
|
415
416
|
},
|
416
417
|
60 => {
|
@@ -420,6 +421,7 @@ my %fileFormat = (
|
|
420
421
|
Shift => 'Time',
|
421
422
|
ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
|
422
423
|
ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
|
424
|
+
PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("1970:01:01 $val") : $val',
|
423
425
|
PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
|
424
426
|
},
|
425
427
|
62 => {
|
@@ -429,6 +431,7 @@ my %fileFormat = (
|
|
429
431
|
Shift => 'Time',
|
430
432
|
ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
|
431
433
|
ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
|
434
|
+
PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("$val 00:00:00") : $val',
|
432
435
|
PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
|
433
436
|
},
|
434
437
|
63 => {
|
@@ -438,6 +441,7 @@ my %fileFormat = (
|
|
438
441
|
Shift => 'Time',
|
439
442
|
ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
|
440
443
|
ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
|
444
|
+
PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("1970:01:01 $val") : $val',
|
441
445
|
PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
|
442
446
|
},
|
443
447
|
65 => {
|
@@ -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.08';
|
19
19
|
|
20
20
|
sub ProcessItemID($$$);
|
21
21
|
sub ProcessLinkInfo($$$);
|
@@ -273,7 +273,9 @@ sub ProcessLinkInfo($$$);
|
|
273
273
|
6 => 'Ram Disk',
|
274
274
|
},
|
275
275
|
},
|
276
|
-
DriveSerialNumber => {
|
276
|
+
DriveSerialNumber => {
|
277
|
+
PrintConv => 'join("-", unpack("A4 A4", sprintf("%08X", $val)))',
|
278
|
+
},
|
277
279
|
VolumeLabel => { },
|
278
280
|
LocalBasePath => { },
|
279
281
|
CommonNetworkRelLink => { },
|
@@ -508,6 +510,7 @@ sub ProcessLinkInfo($$$)
|
|
508
510
|
if ($off + 0x20 <= $dataLen) {
|
509
511
|
# my $len = Get32u($dataPt, $off);
|
510
512
|
$et->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
|
513
|
+
$et->HandleTag($tagTablePtr, 'DriveSerialNumber', undef, %opts, Start=>$off+8);
|
511
514
|
$pos = Get32u($dataPt, $off + 0x0c);
|
512
515
|
if ($pos == 0x14) {
|
513
516
|
# use VolumeLabelOffsetUnicode instead
|