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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f29848f7a068302c03f2847eff9e3daf8ce7379cc676fcbfda76a3ef534fba4
4
- data.tar.gz: 80952d3f13272898576e90899f3b3623eec46d3a193fa334daaa7838219a12f0
3
+ metadata.gz: e72fd223e20ba074cc12f4a4b8746c48911099845c2b0bdabb3066ba3b68c930
4
+ data.tar.gz: 03c78c3768b36216b3ad2c5d83d1fbd9e3e702581d2bd2cd09ce85b895fe169e
5
5
  SHA512:
6
- metadata.gz: f8c2b1352e32b75492ab82b890c9745e5fab108779eb0411d6fdfc76d2584e26082a9cbd8cdf9e4a1fe3bd7b370cec4969d3e84459db4e8876155304d3f0f524
7
- data.tar.gz: daeab0ada07d19fa91766bff48d1e3c5d31ea4b3f3856d21972bc31890fbe9f1cba4cf6b1b66672cec07ffa0df62b9432a02960e4a0ab97365c0fecdf8bf030a
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
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.80"
53
+ "version" : "12.82"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: 0
32
32
  requires:
33
33
  perl: 5.004
34
- version: 12.80
34
+ version: 12.82
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.80.tar.gz | tar -xf -
113
- cd Image-ExifTool-12.80
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.80';
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
- print "City,Region,Subregion,CountryCode,Country,TimeZone,FeatureCode,Population,Latitude,Longitude\n";
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
- $_ = defined $_ ? $mt->Decode($_, 'UTF8') : '' foreach @entry[0,1,2,4];
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.80 --
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 and GeolocFeature options
6439
- apply to the B<-listgeo> output. Here are some examples:
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.54';
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
- 'MWG::Regions' => 'MWG::Composite',
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 simpify
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
- foreach $tag (sort keys %$struct) {
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 (%addedMain, @sorted);
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.38';
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 eq "IIII\x04\0\x04\0" or return 0;
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.92';
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 => { Name => 'CropTopLeft', Writable => 'int32u' }, #forum15784
554
- 0x1052 => { Name => 'CropCenter', Writable => 'int32u' }, #forum15784
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 => 0xf0000,
1044
+ Mask => 0xff0000,
1037
1045
  PrintConv => {
1038
1046
  0 => 'n/a',
1039
1047
  OTHER => sub {
1040
1048
  my ($val, $inv) = @_;
1041
- return "$val x $val" unless $inv;
1042
- $val =~ s/ ?x.*//;
1043
- return $val;
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
  },