exiftool_vendored 12.80.0 → 12.82.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 +44 -0
- data/bin/MANIFEST +4 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -2
- data/bin/exiftool +35 -13
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +44 -31
- data/bin/lib/Image/ExifTool/CanonVRD.pm +2 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +20 -7
- data/bin/lib/Image/ExifTool/GM.pm +543 -0
- data/bin/lib/Image/ExifTool/Geolocation.pm +332 -149
- data/bin/lib/Image/ExifTool/Geotag.pm +9 -4
- data/bin/lib/Image/ExifTool/M2TS.pm +32 -4
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +331 -22
- data/bin/lib/Image/ExifTool/NikonCustom.pm +55 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +1 -0
- data/bin/lib/Image/ExifTool/OpenEXR.pm +21 -3
- data/bin/lib/Image/ExifTool/PNG.pm +3 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +40 -24
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +61 -30
- data/bin/lib/Image/ExifTool/README +2 -0
- data/bin/lib/Image/ExifTool/Sony.pm +1 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4815 -4775
- data/bin/lib/Image/ExifTool/TagNames.pod +931 -617
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +30 -8
- data/bin/lib/Image/ExifTool/Writer.pl +10 -4
- data/bin/lib/Image/ExifTool/XMP.pm +4 -2
- data/bin/lib/Image/ExifTool.pm +77 -41
- data/bin/lib/Image/ExifTool.pod +24 -11
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e72fd223e20ba074cc12f4a4b8746c48911099845c2b0bdabb3066ba3b68c930
|
4
|
+
data.tar.gz: 03c78c3768b36216b3ad2c5d83d1fbd9e3e702581d2bd2cd09ce85b895fe169e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a0c7336b467061e914f44977a25fa24cb67572998306b21b1019b346ecd423a908774759c9af636f79ff3467624762cd5437d5c347e1a6475f78e6ea839fba5
|
7
|
+
data.tar.gz: b654799b378c684a8d2ec1d2638e3d16de1d9daf91b67f1c0c681fc1407872e057f94b90d630a0cc2218ec286c4d92e5c0a2df4f01ed730f9852feb527857d98
|
data/bin/Changes
CHANGED
@@ -7,6 +7,47 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 12.76. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Apr. 5, 2024 - Version 12.82 - "GM PDR"
|
11
|
+
|
12
|
+
- Added support for reading GM PDR data from MP4 videos written by cars such
|
13
|
+
as Corvettes and Cameros
|
14
|
+
- Added support for reading timed GPS from Wolfbox dashcam videos
|
15
|
+
- Added "Unknown trailer" to QuickTime warnings originating from an unknown
|
16
|
+
trailer
|
17
|
+
- Added a new Nikon LensID
|
18
|
+
- Extract PreviewImage from Chigee AIO-5 dashcam videos
|
19
|
+
- Changed name and print conversion of a recently added FujiFilm tag
|
20
|
+
- Only issue "Tag not defined" warnings for the first sub-document when using
|
21
|
+
the -p option
|
22
|
+
- Fixed a Nikon Z lens name (github #250)
|
23
|
+
- Fixed Windows version so -sort works properly with -listgeo
|
24
|
+
- API Changes:
|
25
|
+
- Added PrintCSV option for optimized extraction of GM PDR data in CSV
|
26
|
+
format
|
27
|
+
|
28
|
+
Mar. 27, 2024 - Version 12.81
|
29
|
+
|
30
|
+
- Added ability to read EXIF and XMP from EXR images
|
31
|
+
- Added ability to delete unknown trailer when writing MOV/MP4 videos
|
32
|
+
- Added ability to write a couple of Stable Diffusion PNG tags
|
33
|
+
- Added ability to write one of the Microsoft Xtra Description tags (github
|
34
|
+
#248)
|
35
|
+
- Added support for using alternate city names in reverse Geolocation
|
36
|
+
- Added support for reading timed GPS from DOD LS600W TS videos
|
37
|
+
- Added support for new version of Canon DR4 files
|
38
|
+
- Added a number of new iTunesInfo tags
|
39
|
+
- Added a new Olympus LensType
|
40
|
+
- Decode a number of new Nikon tags (thanks Warren Hatch)
|
41
|
+
- Allow regular expressions to be used when writing Geolocate tag
|
42
|
+
- Enhanced writing of Geolocate tag to also write Keys:LocationName
|
43
|
+
- Cache the results of the last reverse geolocation search to speed batch
|
44
|
+
processing when multiple files have the same search parameters
|
45
|
+
- Patched problem that could cause runtime errors with some invaid tag names
|
46
|
+
- Fixed a couple of newly added FujiFilm tags
|
47
|
+
- Fixed decoding of FujiFilm AFAreaZoneSize
|
48
|
+
- API Changes:
|
49
|
+
- Added GeolocAltNames option
|
50
|
+
|
10
51
|
Mar. 19, 2024 - Version 12.80
|
11
52
|
|
12
53
|
- Added GeolocationFeatureCode tag
|
@@ -19,6 +60,8 @@ Mar. 19, 2024 - Version 12.80
|
|
19
60
|
- Improved accuracy of Geolocation distance/bearing calculations
|
20
61
|
- Changed structure of Geolocation database (now version 1.02)
|
21
62
|
- Minor change to key format for user-defined Geolocation name translations
|
63
|
+
- Ignore API Geolocation option when copying tags if none of the Geolocation
|
64
|
+
tags are being copied
|
22
65
|
- Fixed case/spacing of "C2PA" in some CBOR tag descriptions
|
23
66
|
- Fixed bug extracting binary data from EXR files
|
24
67
|
- API Changes:
|
@@ -29,6 +72,7 @@ Mar. 15, 2024 - Version 12.79
|
|
29
72
|
- Improvements to new Geolocation feature:
|
30
73
|
- Added reverse Geolocation ability (obtain GPS coordinates from city
|
31
74
|
name), with support for regular expressions
|
75
|
+
- Added ability to geolocate while geotagging
|
32
76
|
- Added -listgeo option to list the Geolocation database
|
33
77
|
- Added the ability to include user-defined cities in the Geolocation
|
34
78
|
database
|
data/bin/MANIFEST
CHANGED
@@ -80,6 +80,7 @@ html/TagNames/FujiFilm.html
|
|
80
80
|
html/TagNames/GE.html
|
81
81
|
html/TagNames/GIF.html
|
82
82
|
html/TagNames/GIMP.html
|
83
|
+
html/TagNames/GM.html
|
83
84
|
html/TagNames/GPS.html
|
84
85
|
html/TagNames/GeoTiff.html
|
85
86
|
html/TagNames/GoPro.html
|
@@ -293,6 +294,7 @@ lib/Image/ExifTool/FujiFilm.pm
|
|
293
294
|
lib/Image/ExifTool/GE.pm
|
294
295
|
lib/Image/ExifTool/GIF.pm
|
295
296
|
lib/Image/ExifTool/GIMP.pm
|
297
|
+
lib/Image/ExifTool/GM.pm
|
296
298
|
lib/Image/ExifTool/GPS.pm
|
297
299
|
lib/Image/ExifTool/GeoLang/cs.pm
|
298
300
|
lib/Image/ExifTool/GeoLang/de.pm
|
@@ -626,6 +628,8 @@ t/Geolocation_3.out
|
|
626
628
|
t/Geolocation_4.out
|
627
629
|
t/Geolocation_5.out
|
628
630
|
t/Geolocation_6.out
|
631
|
+
t/Geolocation_7.out
|
632
|
+
t/Geolocation_8.out
|
629
633
|
t/Geotag.t
|
630
634
|
t/Geotag_10.out
|
631
635
|
t/Geotag_11.out
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
109
109
|
terminal window to extract and run ExifTool:
|
110
110
|
|
111
111
|
cd ~/Desktop
|
112
|
-
gzip -dc Image-ExifTool-12.
|
113
|
-
cd Image-ExifTool-12.
|
112
|
+
gzip -dc Image-ExifTool-12.82.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-12.82
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
115
115
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
@@ -238,6 +238,7 @@ information:
|
|
238
238
|
html/ExifTool.html - API documentation
|
239
239
|
html/TagNames/index.html - Tag name documentation
|
240
240
|
html/geotag.html - Geotag feature
|
241
|
+
html/geolocation.html - Geolocation feature
|
241
242
|
html/faq.html - Frequently asked questions
|
242
243
|
html/filename.html - Renaming/moving files
|
243
244
|
html/metafiles.html - Working with metadata sidecar files
|
data/bin/exiftool
CHANGED
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use warnings;
|
12
12
|
require 5.004;
|
13
13
|
|
14
|
-
my $version = '12.
|
14
|
+
my $version = '12.82';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -217,7 +217,7 @@ my $tmpFile; # temporary file to delete on exit
|
|
217
217
|
my $tmpText; # temporary text file
|
218
218
|
my $validFile; # flag indicating we processed a valid file
|
219
219
|
my $verbose; # verbose setting
|
220
|
-
my $vout; # verbose output file reference (\*STDOUT or \*STDERR)
|
220
|
+
my $vout; # verbose output file reference (\*STDOUT or \*STDERR by default)
|
221
221
|
my $windowTitle; # title for console window
|
222
222
|
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
223
223
|
my $xml; # flag for XML-formatted output
|
@@ -723,17 +723,23 @@ for (;;) {
|
|
723
723
|
require Image::ExifTool::Geolocation;
|
724
724
|
my ($i, $entry);
|
725
725
|
print "Geolocation database:\n" unless $quiet;
|
726
|
-
|
726
|
+
my $isAlt = $mt->Options('GeolocAltNames') ? ',AltNames' : '';
|
727
|
+
$isAlt = '' if $isAlt and not Image::ExifTool::Geolocation::ReadAltNames();
|
728
|
+
print "City,Region,Subregion,CountryCode,Country,TimeZone,FeatureCode,Population,Latitude,Longitude$isAlt\n";
|
727
729
|
Image::ExifTool::Geolocation::SortDatabase('City') if $sortOpt;
|
728
730
|
my $minPop = $mt->Options('GeolocMinPop');
|
729
731
|
my $feature = $mt->Options('GeolocFeature') || '';
|
730
732
|
my $neg = $feature =~ s/^-//;
|
731
733
|
my %fcodes = map { lc($_) => 1 } split /\s*,\s*/, $feature;
|
734
|
+
my @isUTF8 = (0,1,2,4); # items that need converting from UTF8
|
735
|
+
push @isUTF8, 10 if $isAlt;
|
732
736
|
for ($i=0; ; ++$i) {
|
733
|
-
my @entry = Image::ExifTool::Geolocation::GetEntry($i,$langOpt) or last;
|
737
|
+
my @entry = Image::ExifTool::Geolocation::GetEntry($i,$langOpt,1) or last;
|
734
738
|
next if $minPop and $entry[7] < $minPop;
|
735
739
|
next if %fcodes and $neg ? $fcodes{lc $entry[6]} : not $fcodes{lc $entry[6]};
|
736
|
-
|
740
|
+
push @entry, Image::ExifTool::Geolocation::GetAltNames($i,1) if $isAlt;
|
741
|
+
$_ = defined $_ ? $mt->Decode($_, 'UTF8') : '' foreach @entry[@isUTF8];
|
742
|
+
pop @entry if $isAlt and not $entry[10];
|
737
743
|
print join(',', @entry), "\n";
|
738
744
|
}
|
739
745
|
} else { # 'g(\d*)'
|
@@ -1365,11 +1371,11 @@ for (;;) {
|
|
1365
1371
|
$useMWG = 1;
|
1366
1372
|
} elsif (/^([-\w]+:)*(filename|directory|testname)\b/i) {
|
1367
1373
|
$doSetFileName = 1;
|
1368
|
-
} elsif (/^([-\w]+:)*(geotag|geotime|geosync)\b/i) {
|
1374
|
+
} elsif (/^([-\w]+:)*(geotag|geotime|geosync|geolocate)\b/i) {
|
1369
1375
|
if (lc $2 eq 'geotime') {
|
1370
1376
|
$addGeotime = '';
|
1371
1377
|
} else {
|
1372
|
-
# add geotag/geosync commands first
|
1378
|
+
# add geotag/geosync/geolocate commands first
|
1373
1379
|
unshift @newValues, pop @newValues;
|
1374
1380
|
if (lc $2 eq 'geotag' and (not defined $addGeotime or $addGeotime) and length $val) {
|
1375
1381
|
$addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal#';
|
@@ -2175,7 +2181,7 @@ sub GetImageInfo($$)
|
|
2175
2181
|
|
2176
2182
|
my $lineCount = 0;
|
2177
2183
|
my ($fp, $outfile, $append);
|
2178
|
-
if ($textOut and $verbose and not $tagOut) {
|
2184
|
+
if ($textOut and ($verbose or $et->Options('PrintCSV')) and not $tagOut) {
|
2179
2185
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2180
2186
|
$fp or EFile($file), ++$countBad, return;
|
2181
2187
|
# delete file if we exit prematurely (unless appending)
|
@@ -2298,7 +2304,7 @@ sub GetImageInfo($$)
|
|
2298
2304
|
$lastDoc = 0;
|
2299
2305
|
}
|
2300
2306
|
for ($doc=0; $doc<=$lastDoc; ++$doc) {
|
2301
|
-
my $skipBody;
|
2307
|
+
my ($skipBody, $opt);
|
2302
2308
|
foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
|
2303
2309
|
my $prf = $printFmt{$type} or next;
|
2304
2310
|
if ($type eq 'HEAD' and defined $outfile) {
|
@@ -2306,6 +2312,12 @@ sub GetImageInfo($$)
|
|
2306
2312
|
$wroteHEAD{$outfile} = 1;
|
2307
2313
|
}
|
2308
2314
|
next if $type eq 'BODY' and $skipBody;
|
2315
|
+
# silence "IF" warnings and warnings for subdocuments > 1
|
2316
|
+
if ($type eq 'IF' or ($doc > 1 and not $$et{OPTIONS}{IgnoreMinorErrors})) {
|
2317
|
+
$opt = 'Silent';
|
2318
|
+
} else {
|
2319
|
+
$opt = 'Warn';
|
2320
|
+
}
|
2309
2321
|
if ($lastDoc) {
|
2310
2322
|
if ($doc) {
|
2311
2323
|
next if $type eq 'HEAD' or $type eq 'TAIL'; # only repeat SECT/IF/BODY/ENDS
|
@@ -2315,7 +2327,6 @@ sub GetImageInfo($$)
|
|
2315
2327
|
}
|
2316
2328
|
}
|
2317
2329
|
my @lines;
|
2318
|
-
my $opt = $type eq 'IF' ? 'Silent' : 'Warn'; # silence "IF" warnings
|
2319
2330
|
foreach (@$prf) {
|
2320
2331
|
my $line = $et->InsertTagValues($_, \@foundTags, $opt, $grp, $cache);
|
2321
2332
|
if ($type eq 'IF') {
|
@@ -5657,7 +5668,7 @@ with this command:
|
|
5657
5668
|
|
5658
5669
|
produces output like this:
|
5659
5670
|
|
5660
|
-
-- Generated by ExifTool 12.
|
5671
|
+
-- Generated by ExifTool 12.82 --
|
5661
5672
|
File: a.jpg - 2003:10:31 15:44:19
|
5662
5673
|
(f/5.6, 1/60s, ISO 100)
|
5663
5674
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6435,8 +6446,9 @@ otherwise family 0 is assumed. The B<-l> option may be combined with
|
|
6435
6446
|
B<-listf>, B<-listr> or B<-listwf> to add file descriptions to the list.
|
6436
6447
|
The B<-lang> option may be combined with B<-listx> to output descriptions in
|
6437
6448
|
a single language, and the B<-sort> and/or B<-lang> options may be combined
|
6438
|
-
with B<-listgeo>. Also, the API GeolocMinPop
|
6439
|
-
apply to the B<-listgeo> output. Here are some
|
6449
|
+
with B<-listgeo>. Also, the API GeolocMinPop, GeolocFeature and
|
6450
|
+
GeolocAltNames options apply to the B<-listgeo> output. Here are some
|
6451
|
+
examples:
|
6440
6452
|
|
6441
6453
|
-list # list all tag names
|
6442
6454
|
-list -EXIF:All # list all EXIF tags
|
@@ -6538,6 +6550,10 @@ examples. Also see "geotag.html" in the full ExifTool distribution and the
|
|
6538
6550
|
L<Image::ExifTool Options|Image::ExifTool/Options> for more details and for
|
6539
6551
|
information about geotag configuration options.
|
6540
6552
|
|
6553
|
+
The API Geolocation option may be set to the value "geotag" to also write
|
6554
|
+
the name, province/state and country of the nearest city while geotagging.
|
6555
|
+
See L<https://exiftool.org/geolocation.html> for details.
|
6556
|
+
|
6541
6557
|
=item B<-globalTimeShift> I<SHIFT>
|
6542
6558
|
|
6543
6559
|
Shift all formatted date/time values by the specified amount when reading.
|
@@ -7435,6 +7451,12 @@ Geotag an image (C<a.jpg>) from position information in a GPS track log
|
|
7435
7451
|
DateTimeOriginal is used for geotagging. Local system time is assumed
|
7436
7452
|
unless DateTimeOriginal contains a timezone.
|
7437
7453
|
|
7454
|
+
=item exiftool -geotag track.log -geolocate=geotag a.jpg
|
7455
|
+
|
7456
|
+
Geotag an image and also write geolocation information of the nearest city
|
7457
|
+
(city name, state/province and country). Read here for more details about
|
7458
|
+
the Geolocation feature: L<https://exiftool.org/geolocation.html#Write>
|
7459
|
+
|
7438
7460
|
=item exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg
|
7439
7461
|
|
7440
7462
|
Geotag an image with the GPS position for a specific time.
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
35
35
|
use Image::ExifTool::Validate;
|
36
36
|
use Image::ExifTool::MacOS;
|
37
37
|
|
38
|
-
$VERSION = '3.
|
38
|
+
$VERSION = '3.55';
|
39
39
|
@ISA = qw(Exporter);
|
40
40
|
|
41
41
|
sub NumbersFirst($$);
|
@@ -95,16 +95,9 @@ my %tweakOrder = (
|
|
95
95
|
Lytro => 'SigmaRaw',
|
96
96
|
PhotoMechanic => 'FotoStation',
|
97
97
|
Microsoft => 'PhotoMechanic',
|
98
|
-
'Microsoft::MP'=> 'Microsoft::MP1',
|
99
98
|
GIMP => 'Microsoft',
|
100
|
-
'Nikon::CameraSettingsD300' => 'Nikon::ShotInfoD300b',
|
101
|
-
'Pentax::LensData' => 'Pentax::LensInfo2',
|
102
|
-
'Sony::SRF2' => 'Sony::SRF',
|
103
99
|
DarwinCore => 'AFCP',
|
104
|
-
|
105
|
-
'MWG::Keywords' => 'MWG::Regions',
|
106
|
-
'MWG::Collections' => 'MWG::Keywords',
|
107
|
-
'GoPro::fdsc' => 'GoPro::KBAT',
|
100
|
+
MWG => 'Shortcuts',
|
108
101
|
);
|
109
102
|
|
110
103
|
# list of all recognized Format strings
|
@@ -671,6 +664,15 @@ will extract all available information even for tags not listed.
|
|
671
664
|
Tags in these tables are referred to as "pseudo" tags because their
|
672
665
|
information is not stored in the file itself. As such, B<Writable> tags in
|
673
666
|
these tables may be changed without having to rewrite the file.
|
667
|
+
},
|
668
|
+
GM => q{
|
669
|
+
These tags are extracted from GM/Cosworth PDR (Performance Data Recorder)
|
670
|
+
information found in videos from General Motors cars such as Corvette and
|
671
|
+
Camero.
|
672
|
+
|
673
|
+
Use the API L<PrintCSV|../ExifTool.html#PrintCSV> option to output all timed
|
674
|
+
PDR data in CSV format at greatly increased speed and with much lower memory
|
675
|
+
usage.
|
674
676
|
},
|
675
677
|
PodTrailer => q{
|
676
678
|
~head1 NOTES
|
@@ -708,7 +710,7 @@ my %shortcutNotes = (
|
|
708
710
|
color space when deleting all other metadata
|
709
711
|
},
|
710
712
|
CommonIFD0 => q{
|
711
|
-
common metadata tags found in IFD0 of TIFF-format images. Used to
|
713
|
+
common metadata tags found in IFD0 of TIFF-format images. Used to simplify
|
712
714
|
deletion of all metadata from these images. See
|
713
715
|
L<FAQ number 7|../faq.html#Q7> for details
|
714
716
|
},
|
@@ -852,7 +854,7 @@ sub new
|
|
852
854
|
my ($tagID, $binaryTable, $noID, $hexID, $isIPTC, $isXMP);
|
853
855
|
$isIPTC = 1 if $writeProc and $writeProc eq \&Image::ExifTool::IPTC::WriteIPTC;
|
854
856
|
# generate flattened tag names for structure fields if this is an XMP table
|
855
|
-
if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') {
|
857
|
+
if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP' or $$vars{ADD_FLATTENED}) {
|
856
858
|
Image::ExifTool::XMP::AddFlattenedTags($table);
|
857
859
|
$isXMP = 1;
|
858
860
|
}
|
@@ -1526,7 +1528,8 @@ TagID: foreach $tagID (@keys) {
|
|
1526
1528
|
my $fullName = ($strName =~ / / ? '' : 'XMP ') . "$strName Struct";
|
1527
1529
|
my $info = $tagNameInfo{$fullName} = [ ];
|
1528
1530
|
my $tag;
|
1529
|
-
|
1531
|
+
my $order = $$struct{SORT_ORDER} || [ sort keys %$struct ];
|
1532
|
+
foreach $tag (@$order) {
|
1530
1533
|
my $tagInfo = $$struct{$tag};
|
1531
1534
|
next unless ref $tagInfo eq 'HASH' and $tag ne 'NAMESPACE' and $tag ne 'GROUPS';
|
1532
1535
|
warn "WARNING: $strName Struct containes $tag\n" if $Image::ExifTool::specialTags{$tag};
|
@@ -1539,6 +1542,8 @@ TagID: foreach $tagID (@keys) {
|
|
1539
1542
|
push @vals, $writable;
|
1540
1543
|
$structs{$writable} = 1;
|
1541
1544
|
$writable = "=$writable";
|
1545
|
+
} elsif (defined $$tagInfo{Writable}) {
|
1546
|
+
$writable = 'no';
|
1542
1547
|
} else {
|
1543
1548
|
$writable = 'string';
|
1544
1549
|
}
|
@@ -1548,7 +1553,7 @@ TagID: foreach $tagID (@keys) {
|
|
1548
1553
|
# handle PrintConv lookups in Structure elements
|
1549
1554
|
my $printConv = $$tagInfo{PrintConv};
|
1550
1555
|
if (ref $printConv eq 'HASH') {
|
1551
|
-
foreach (sort keys %$printConv) {
|
1556
|
+
foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
|
1552
1557
|
next if /^(OTHER|BITMASK)$/;
|
1553
1558
|
push @vals, "$_ = $$printConv{$_}";
|
1554
1559
|
}
|
@@ -1822,24 +1827,7 @@ sub TweakOrder($$)
|
|
1822
1827
|
local $_;
|
1823
1828
|
my ($sortedTables, $tweakOrder) = @_;
|
1824
1829
|
my @tweak = sort keys %$tweakOrder;
|
1825
|
-
my (%
|
1826
|
-
# flag files which have a "Main" table
|
1827
|
-
foreach (@$sortedTables) {
|
1828
|
-
$addedMain{$1} = 0 if /^Image::ExifTool::(\w+)::(\w+)/ and $2 eq 'Main';
|
1829
|
-
}
|
1830
|
-
# make sure that the main table always comes first in each file
|
1831
|
-
foreach (@$sortedTables) {
|
1832
|
-
if (/^Image::ExifTool::(\w+)::(\w+)/) {
|
1833
|
-
if ($addedMain{$1}) {
|
1834
|
-
next if $2 eq 'Main'; # don't add again
|
1835
|
-
} elsif (defined $addedMain{$1}) {
|
1836
|
-
push @sorted, "Image::ExifTool::${1}::Main" if $2 ne 'Main';
|
1837
|
-
$addedMain{$1} = 1;
|
1838
|
-
}
|
1839
|
-
}
|
1840
|
-
push @sorted, $_;
|
1841
|
-
}
|
1842
|
-
@$sortedTables = @sorted;
|
1830
|
+
my (@sorted, %hasMain, %module, $entry);
|
1843
1831
|
# apply manual tweaks
|
1844
1832
|
while (@tweak) {
|
1845
1833
|
my $table = shift @tweak;
|
@@ -1858,6 +1846,31 @@ sub TweakOrder($$)
|
|
1858
1846
|
}
|
1859
1847
|
@$sortedTables = (@notMoving, @moving, @after);
|
1860
1848
|
}
|
1849
|
+
# flag modules which have a "Main" table, and organize tables by module name
|
1850
|
+
foreach (@$sortedTables) {
|
1851
|
+
if (not /^Image::ExifTool::(\w+)::(\w+)/) {
|
1852
|
+
push @sorted, $_;
|
1853
|
+
} else {
|
1854
|
+
$hasMain{$1} = 1 if $2 eq 'Main';
|
1855
|
+
push @sorted, $module{$1} = [ ] unless $module{$1};
|
1856
|
+
push @{$module{$1}}, $_;
|
1857
|
+
}
|
1858
|
+
}
|
1859
|
+
# force MWG::Composite table first
|
1860
|
+
my @mwg = ( 'Image::ExifTool::MWG::Composite' );
|
1861
|
+
/Composite/ or push @mwg, $_ foreach @{$module{MWG}};
|
1862
|
+
@{$module{MWG}} = @mwg;
|
1863
|
+
# make sure that the main table always comes first in each file
|
1864
|
+
# and that all other tables from this group follow
|
1865
|
+
@$sortedTables = ( );
|
1866
|
+
foreach $entry (@sorted) {
|
1867
|
+
ref $entry or push(@$sortedTables, $entry), next;
|
1868
|
+
$$entry[0] =~ /^Image::ExifTool::(\w+)::(\w+)/ or die 'Internal error';
|
1869
|
+
my $main = "Image::ExifTool::$1::Main";
|
1870
|
+
# main table must come first (even if it doesn't exist)
|
1871
|
+
push @$sortedTables, $main if $hasMain{$1};
|
1872
|
+
$_ eq $main or push(@$sortedTables, $_) foreach @$entry;
|
1873
|
+
}
|
1861
1874
|
}
|
1862
1875
|
|
1863
1876
|
#------------------------------------------------------------------------------
|
@@ -23,7 +23,7 @@ use vars qw($VERSION);
|
|
23
23
|
use Image::ExifTool qw(:DataAccess :Utils);
|
24
24
|
use Image::ExifTool::Canon;
|
25
25
|
|
26
|
-
$VERSION = '1.
|
26
|
+
$VERSION = '1.39';
|
27
27
|
|
28
28
|
sub ProcessCanonVRD($$;$);
|
29
29
|
sub WriteCanonVRD($$;$);
|
@@ -1758,7 +1758,7 @@ sub ProcessDR4($$;$)
|
|
1758
1758
|
} else {
|
1759
1759
|
# load DR4 file into memory
|
1760
1760
|
my $buff;
|
1761
|
-
$raf->Read($buff, 8) == 8 and $buff
|
1761
|
+
$raf->Read($buff, 8) == 8 and $buff =~ /^IIII[\x04|\x05]\0\x04\0/ or return 0;
|
1762
1762
|
$et->SetFileType();
|
1763
1763
|
$raf->Seek(0, 2) or return $err = 1;
|
1764
1764
|
$dirLen = $raf->Tell();
|
@@ -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.94';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -550,8 +550,16 @@ my %faceCategories = (
|
|
550
550
|
3 => 'Electronic Front Curtain', #10
|
551
551
|
},
|
552
552
|
},
|
553
|
-
0x1051 => {
|
554
|
-
|
553
|
+
0x1051 => { #forum15784
|
554
|
+
Name => 'CropFlag',
|
555
|
+
Writable => 'int8u',
|
556
|
+
Notes => q(
|
557
|
+
this tag exists only if the image was cropped, and is 0 for cropped JPG
|
558
|
+
image or 1 for a cropped RAF
|
559
|
+
),
|
560
|
+
},
|
561
|
+
0x1052 => { Name => 'CropTopLeft', Writable => 'int32u' }, #forum15784
|
562
|
+
0x1053 => { Name => 'CropSize', Writable => 'int32u' }, #forum15784
|
555
563
|
# 0x1100 - This may not work well for newer cameras (ref forum12682)
|
556
564
|
0x1100 => [{
|
557
565
|
Name => 'AutoBracketing',
|
@@ -1033,14 +1041,19 @@ my %faceCategories = (
|
|
1033
1041
|
},
|
1034
1042
|
0.5 => {
|
1035
1043
|
Name => 'AFAreaZoneSize',
|
1036
|
-
Mask =>
|
1044
|
+
Mask => 0xff0000,
|
1037
1045
|
PrintConv => {
|
1038
1046
|
0 => 'n/a',
|
1039
1047
|
OTHER => sub {
|
1040
1048
|
my ($val, $inv) = @_;
|
1041
|
-
|
1042
|
-
$
|
1043
|
-
|
1049
|
+
my ($w, $h);
|
1050
|
+
if ($inv) {
|
1051
|
+
my ($w, $h) = $val =~ /(\d+)/g;
|
1052
|
+
return 0 unless $w and $h;
|
1053
|
+
return((($h << 5) & 0xf0) | ($w & 0x0f));
|
1054
|
+
}
|
1055
|
+
($w, $h) = ($val & 0x0f, $val >> 5);
|
1056
|
+
return "$w x $h";
|
1044
1057
|
},
|
1045
1058
|
},
|
1046
1059
|
},
|