exiftool_vendored 12.58.0 → 12.59.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: daebca4fbc1adcea00bcf7dc637e328f4534a115f69a17f10bca60f8a21dee01
4
- data.tar.gz: 512c1da726768d49d97b8262303f8c524b4ea23ccc8c25f1350f93a121813be4
3
+ metadata.gz: a40c897eadb8162344b81eedcedd1888cfac911d28c1e5542f8e3d323af06768
4
+ data.tar.gz: a761f6527a380e369e78c34d2c061a9652ae63a3da0b7e70be1854fb8b728ee6
5
5
  SHA512:
6
- metadata.gz: 6d29ac70643b583a0d01c512e2054700e15cdf60091042ed4de7c3de85feca75fcd94b2201691a0360875c02b293cc00632c6dce29888e735a488dac50712c70
7
- data.tar.gz: cee8f9dcbe026dc2e5bb1de5db902904c460c6e71cf4ab9ac64b9f2a8357c3857be328912f1deedf3f51c00f99b50f07b463884e60f235f858ef33bf5cd417f7
6
+ metadata.gz: 7edad248448957b58317b1621b2ae5b0c67276ee988ec1fb043403f299d6b0476ab7e79f4a15c345f9c655ff79518235350797b65b4b94cc5f80759511a44759
7
+ data.tar.gz: a4cec80d9709c1145958d4c6590349bdf6b0fc18f041e62962fc736a660d0243a29abc5c68e481198c9b42e584cedc7f1536081c0c59ffd57f90caac704fb0ad
data/bin/Changes CHANGED
@@ -7,6 +7,31 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.50. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Mar. 28, 2023 - Version 12.59
11
+
12
+ - COMPATIBILITY WARNING: Changed the calculated ImageDataMD5 for JPEG images
13
+ to include all data from the SOS to the EOI (including the SOS marker but
14
+ not the EOI marker)
15
+ - Added new -fileNUM option to load tags from alternate files
16
+ - Added family 8 groups for accessing tags from alternate files
17
+ - Added new XMP-et:OriginalImageMD5 tag for storing ImageDataMD5 value
18
+ - Added verbose ImageDataMD5 message for JPEG files
19
+ - Added a new Nikon LensID (thanks Warren Hatch)
20
+ - Decode a new Olympus tag and improved decoding of another (thanks Herb)
21
+ - Decode a couple of new PanasonicRaw tags
22
+ - Decode image coordinates for a couple more VNT object types
23
+ - Enhanced ImageDataMD5 to also support MRW, CR3, PNG, MOV/MP4 and RIFF-based
24
+ files
25
+ - Improved verbose messages when deleting NikonApp trailer
26
+ - Patched to avoid structure warnings when copying tags from Nikon files
27
+ containing NKSC metadata
28
+ - Fixed %-C filename format code to work properly with the -fileOrder and
29
+ -progress options
30
+ - Fixed new ImageDataMD5 tag to work properly with PhaseOne IIQ files
31
+ - Fixed potential ValueConv warning when reading LIF files
32
+ - API Changes:
33
+ - Added SetAlternateFile method
34
+
10
35
  Mar. 15, 2023 - Version 12.58
11
36
 
12
37
  - Added Extra ImageDataMD5 tag to calculate MD5 of image data only
data/bin/MANIFEST CHANGED
@@ -530,6 +530,8 @@ t/ExifTool_3.out
530
530
  t/ExifTool_30.out
531
531
  t/ExifTool_31.out
532
532
  t/ExifTool_32.out
533
+ t/ExifTool_33.out
534
+ t/ExifTool_34.out
533
535
  t/ExifTool_4.out
534
536
  t/ExifTool_5.out
535
537
  t/ExifTool_6.out
@@ -903,6 +905,7 @@ t/Writer_56.out
903
905
  t/Writer_58.out
904
906
  t/Writer_59.out
905
907
  t/Writer_6.out
908
+ t/Writer_60.out
906
909
  t/Writer_7.out
907
910
  t/Writer_9.out
908
911
  t/XMP.t
data/bin/META.json CHANGED
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.58"
50
+ "version" : "12.59"
51
51
  }
data/bin/META.yml CHANGED
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.58
31
+ version: 12.59
data/bin/README CHANGED
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
107
107
  terminal window to extract and run ExifTool:
108
108
 
109
109
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.58.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.58
110
+ gzip -dc Image-ExifTool-12.59.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.59
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
@@ -210,6 +210,7 @@
210
210
  3 => 'PreviewImage (1)',
211
211
  # (if the MPF has 2 previews, MPImage3 could be the larger one)
212
212
  4 => 'MPImage3',
213
+ 5 => 'JpgFromRaw2', # in RW2 from newer Panasonic models
213
214
  },
214
215
  # ValueConv may also be a code reference
215
216
  # Inputs: 0) reference to list of values, 1) ExifTool object
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.58';
14
+ my $version = '12.59';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -103,6 +103,7 @@ my @newValues; # list of new tag values to set
103
103
  my @requestTags; # tags to request (for -p or -if option arguments)
104
104
  my @srcFmt; # source file name format strings
105
105
  my @tags; # list of tags to extract
106
+ my %altFile; # alternate files to extract information (keyed by lower-case family 8 group)
106
107
  my %appended; # list of files appended to
107
108
  my %countLink; # count hard and symbolic links made
108
109
  my %created; # list of files we created
@@ -115,6 +116,7 @@ my %outComma; # flag that output text file needs a comma
115
116
  my %outTrailer; # trailer for output text file
116
117
  my %preserveTime; # preserved timestamps for files
117
118
  my %printFmt; # the contents of the print format file
119
+ my %seqFileDir; # file sequence number in each directory
118
120
  my %setTags; # hash of list references for tags to set from files
119
121
  my %setTagsList; # list of other tag lists for multiple -tagsFromFile from the same file
120
122
  my %usedFileName; # lookup for file names we already used in TestName feature
@@ -196,7 +198,7 @@ my $saveCount; # count the number of times we will/did call SaveNewValues()
196
198
  my $scanWritable; # flag to process only writable file types
197
199
  my $sectHeader; # current section header for -p option
198
200
  my $sectTrailer; # section trailer for -p option
199
- my $seqFileBase; # sequential file number at start of directory
201
+ my $seqFileDir; # sequential file number used for %-C
200
202
  my $seqFileNum; # sequential file number used for %C
201
203
  my $setCharset; # character set setting ('default' if not set and -csv -b used)
202
204
  my $showGroup; # number of group to show (may be zero or '')
@@ -450,6 +452,7 @@ undef %outComma;
450
452
  undef %outTrailer;
451
453
  undef %printFmt;
452
454
  undef %preserveTime;
455
+ undef %seqFileDir;
453
456
  undef %setTags;
454
457
  undef %setTagsList;
455
458
  undef %usedFileName;
@@ -536,7 +539,7 @@ $quiet = 0;
536
539
  $rtnVal = 0;
537
540
  $saveCount = 0;
538
541
  $sectTrailer = '';
539
- $seqFileBase = 0;
542
+ $seqFileDir = 0;
540
543
  $seqFileNum = 0;
541
544
  $tabFormat = 0;
542
545
  $vout = \*STDOUT;
@@ -950,6 +953,10 @@ for (;;) {
950
953
  $mt->Options(FastScan => (length $1 ? $1 : 1));
951
954
  next;
952
955
  }
956
+ if (/^(file\d+)$/i) {
957
+ $altFile{lc $1} = shift or Error("Expecting file name for -file option\n"), $badCmd=1, next;
958
+ next;
959
+ }
953
960
  if (/^fileorder(\d*)$/i) {
954
961
  push @fileOrder, shift if @ARGV;
955
962
  my $num = $1 || 0;
@@ -1939,7 +1946,7 @@ Exit $rtnValApp; # all done
1939
1946
  sub GetImageInfo($$)
1940
1947
  {
1941
1948
  my ($et, $orig) = @_;
1942
- my (@foundTags, $info, $file, $ind);
1949
+ my (@foundTags, $info, $file, $ind, $g8);
1943
1950
 
1944
1951
  # set window title for this file if necessary
1945
1952
  if (defined $windowTitle and $progressCount >= $progressNext) {
@@ -1982,6 +1989,11 @@ sub GetImageInfo($$)
1982
1989
  } else {
1983
1990
  $file = $orig;
1984
1991
  }
1992
+ # set alternate file names
1993
+ foreach $g8 (sort keys %altFile) {
1994
+ my $altName = FilenameSPrintf($altFile{$g8}, $orig);
1995
+ $et->SetAlternateFile($g8, $altName);
1996
+ }
1985
1997
 
1986
1998
  my $pipe = $file;
1987
1999
  if ($doUnzip) {
@@ -2080,6 +2092,8 @@ sub GetImageInfo($$)
2080
2092
  return;
2081
2093
  }
2082
2094
  ++$seqFileNum; # increment our file counter
2095
+ my ($dir) = Image::ExifTool::SplitFileName($orig);
2096
+ $seqFileDir = $seqFileDir{$dir} = ($seqFileDir{$dir} || 0) + 1;
2083
2097
 
2084
2098
  my $lineCount = 0;
2085
2099
  my ($fp, $outfile, $append);
@@ -3741,8 +3755,6 @@ sub ScanDir($$;$)
3741
3755
  $utf8Name = 1;
3742
3756
  }
3743
3757
  return if $ignore{$dir};
3744
- my $oldBase = $seqFileBase;
3745
- $seqFileBase = $seqFileNum;
3746
3758
  # use Win32::FindFile on Windows if available
3747
3759
  # (ReadDir will croak if there is a wildcard, so check for this)
3748
3760
  if ($^O eq 'MSWin32' and $dir !~ /[*?]/) {
@@ -3774,7 +3786,6 @@ sub ScanDir($$;$)
3774
3786
  # use standard perl library routines to read directory
3775
3787
  unless (opendir(DIR_HANDLE, $dir)) {
3776
3788
  Warn("Error opening directory $dir\n");
3777
- $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
3778
3789
  return;
3779
3790
  }
3780
3791
  @fileList = readdir(DIR_HANDLE);
@@ -3854,8 +3865,6 @@ sub ScanDir($$;$)
3854
3865
  }
3855
3866
  ++$countDir;
3856
3867
  $et->Options(CharsetFileName => $enc); # restore original setting
3857
- # update sequential file base for parent directory
3858
- $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
3859
3868
  }
3860
3869
 
3861
3870
  #------------------------------------------------------------------------------
@@ -4151,16 +4160,15 @@ sub NextUnusedFilename($;$)
4151
4160
  return $fmt unless $fmt =~ /%[-+]?\d*\.?\d*[lun]?[cC]/;
4152
4161
  my %sep = ( '-' => '-', '+' => '_' );
4153
4162
  my ($copy, $alpha) = (0, 'a');
4154
- my $seq = $seqFileNum - 1;
4155
4163
  for (;;) {
4156
4164
  my ($filename, $pos) = ('', 0);
4157
4165
  while ($fmt =~ /(%([-+]?)(\d*)(\.?)(\d*)([lun]?)([cC]))/g) {
4158
4166
  $filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
4159
4167
  $pos = pos($fmt);
4160
4168
  my ($sign, $wid, $dec, $wid2, $mod, $tok) = ($2, $3 || 0, $4, $5 || 0, $6, $7);
4161
- my $diff;
4169
+ my $seq;
4162
4170
  if ($tok eq 'C') {
4163
- $diff = $wid - ($sign eq '-' ? $seqFileBase : 0);
4171
+ $seq = $wid + ($sign eq '-' ? $seqFileDir : $seqFileNum) - 1;
4164
4172
  $wid = $wid2;
4165
4173
  } else {
4166
4174
  next unless $dec or $copy;
@@ -4169,13 +4177,13 @@ sub NextUnusedFilename($;$)
4169
4177
  $filename .= $sep{$sign} if $sign;
4170
4178
  }
4171
4179
  if ($mod and $mod ne 'n') {
4172
- my $a = $tok eq 'C' ? Num2Alpha($diff + $seq) : $alpha;
4180
+ my $a = $tok eq 'C' ? Num2Alpha($seq) : $alpha;
4173
4181
  my $str = ($wid and $wid > length $a) ? 'a' x ($wid - length($a)) : '';
4174
4182
  $str .= $a;
4175
4183
  $str = uc $str if $mod eq 'u';
4176
4184
  $filename .= $str;
4177
4185
  } else {
4178
- my $c = $tok eq 'C' ? ($diff + $seq) : $copy;
4186
+ my $c = $tok eq 'C' ? $seq : $copy;
4179
4187
  my $num = $c + ($mod ? 1 : 0);
4180
4188
  $filename .= $wid ? sprintf("%.${wid}d",$num) : $num;
4181
4189
  }
@@ -4746,6 +4754,7 @@ L<Advanced options|/Advanced options>
4746
4754
  -echo[NUM] TEXT Echo text to stdout or stderr
4747
4755
  -efile[NUM][!] ERRFILE Save names of files with errors
4748
4756
  -execute[NUM] Execute multiple commands on one line
4757
+ -fileNUM ALTFILE Load tags from alternate file
4749
4758
  -list_dir List directories, not their contents
4750
4759
  -srcfile FMT Process a different source file
4751
4760
  -stay_open FLAG Keep reading -@ argfile even after EOF
@@ -5018,16 +5027,14 @@ for list-type tags and conditional replacements because each copy operation
5018
5027
  on a tag overrides any previous operations. While this avoids duplicate
5019
5028
  list items when copying groups of tags from a file containing redundant
5020
5029
  information, it also prevents values of different tags from being copied
5021
- into the same list when this is the intent. So a B<-addTagsFromFile> option
5022
- is provided which allows copying of multiple tags into the same list. eg)
5030
+ into the same list when this is the intent. To accumulate values
5031
+ from different operations into the same list, add a C<+> after the initial
5032
+ C<-> of the argument. For example:
5023
5033
 
5024
- exiftool -addtagsfromfile @ '-subject<make' '-subject<model' ...
5034
+ exiftool -tagsfromfile @ '-subject<make' '-+subject<model' ...
5025
5035
 
5026
- Similarly, B<-addTagsFromFile> must be used when conditionally replacing a
5027
- tag to prevent overriding earlier conditions.
5028
-
5029
- Other than these differences, the B<-tagsFromFile> and B<-addTagsFromFile>
5030
- options are equivalent.
5036
+ Similarly, C<-+DSTTAG> must be used when conditionally replacing a tag to
5037
+ prevent overriding earlier conditions.
5031
5038
 
5032
5039
  6) The B<-a> option (allow duplicate tags) is always in effect when copying
5033
5040
  tags from I<SRCFILE>, but the highest priority tag is always copied last so
@@ -5307,15 +5314,15 @@ B<-csv>=I<CSVFILE> feature.
5307
5314
  Organize output by tag group. I<NUM> specifies a group family number, and
5308
5315
  may be 0 (general location), 1 (specific location), 2 (category), 3
5309
5316
  (document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF
5310
- format) or 7 (tag ID). B<-g0> is assumed if a family number is not
5311
- specified. May be combined with other options to add group names to the
5312
- output. Multiple families may be specified by separating them with colons.
5313
- By default the resulting group name is simplified by removing any leading
5314
- C<Main:> and collapsing adjacent identical group names, but this can be
5315
- avoided by placing a colon before the first family number (eg. B<-g:3:1>).
5316
- Use the B<-listg> option to list group names for a specified family. The
5317
- API SavePath and SaveFormat options are automatically enabled if the
5318
- respective family 5 or 6 group names are requested. See the
5317
+ format), 7 (tag ID) or 8 (file number). B<-g0> is assumed if a family
5318
+ number is not specified. May be combined with other options to add group
5319
+ names to the output. Multiple families may be specified by separating them
5320
+ with colons. By default the resulting group name is simplified by removing
5321
+ any leading C<Main:> and collapsing adjacent identical group names, but this
5322
+ can be avoided by placing a colon before the first family number (eg.
5323
+ B<-g:3:1>). Use the B<-listg> option to list group names for a specified
5324
+ family. The API SavePath and SaveFormat options are automatically enabled
5325
+ if the respective family 5 or 6 group names are requested. See the
5319
5326
  L<API GetGroup documentation|Image::ExifTool/GetGroup> for more information.
5320
5327
 
5321
5328
  =item B<-G>[I<NUM>][:I<NUM>...] (B<-groupNames>)
@@ -5523,7 +5530,7 @@ with this command:
5523
5530
 
5524
5531
  produces output like this:
5525
5532
 
5526
- -- Generated by ExifTool 12.58 --
5533
+ -- Generated by ExifTool 12.59 --
5527
5534
  File: a.jpg - 2003:10:31 15:44:19
5528
5535
  (f/5.6, 1/60s, ISO 100)
5529
5536
  File: b.jpg - 2006:05:23 11:57:38
@@ -6414,12 +6421,12 @@ I<SHIFT> string. For example:
6414
6421
 
6415
6422
  Add features from specified plug-in I<MODULE>. Currently, the MWG module is
6416
6423
  the only plug-in module distributed with exiftool. This module adds
6417
- read/write support for tags as recommended by the Metadata Working Group.
6418
- As a convenience, C<-use MWG> is assumed if the C<MWG> group is specified
6419
- for any tag on the command line. See the L<MWG Tags
6420
- documentation|Image::ExifTool::TagNames/MWG Tags> for more details. Note
6421
- that this option is not reversible, and remains in effect until the
6422
- application terminates, even across the B<-execute> option.
6424
+ read/write support for tags as recommended by the Metadata Working Group. As
6425
+ a convenience, C<-use MWG> is assumed if the group name prefix starts with
6426
+ C<MWG:> exactly for any requested tag. See the
6427
+ L<MWG Tags documentation|Image::ExifTool::TagNames/MWG Tags> for more
6428
+ details. Note that this option is not reversible, and remains in effect
6429
+ until the application terminates, even across the B<-execute> option.
6423
6430
 
6424
6431
  =back
6425
6432
 
@@ -6523,6 +6530,14 @@ line. I<NUM> is an optional number that is echoed in the "{ready}" message
6523
6530
  when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
6524
6531
  option no longer suppresses the output "{readyNUM}" message.
6525
6532
 
6533
+ =item B<-file>I<NUM> I<ALTFILE>
6534
+
6535
+ Read tags from an alternate source file. These tags are accessed via the
6536
+ family 8 group name (eg. C<File1:TAG>, C<File2:TAG>, etc). I<ALTFILE> may
6537
+ contain filename formatting codes %d, %f and %e. Among other things, this
6538
+ allows tags from different files to be compared and combined using the
6539
+ B<-if> and B<-p> options.
6540
+
6526
6541
  =item B<-list_dir>
6527
6542
 
6528
6543
  List directories themselves instead of their contents. This option
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
16
16
  use Image::ExifTool::XMP;
17
17
  use Image::ExifTool::GPS;
18
18
 
19
- $VERSION = '1.07';
19
+ $VERSION = '1.08';
20
20
 
21
21
  sub ProcessDJIInfo($$$);
22
22
 
@@ -104,7 +104,7 @@ my %convFloat2 = (
104
104
  0x00 => { Name => 'AmbientTemperature', Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' }, # (NC)
105
105
  0x04 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' },
106
106
  0x08 => { Name => 'Emissivity', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
107
- 0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %",$val*100)' },
107
+ 0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %%",$val*100)' },
108
108
  0x10 => { Name => 'ReflectedTemperature',Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' },
109
109
  0x65 => { Name => 'IDString', Format => 'string[16]' }, # (NC)
110
110
  );
@@ -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.43';
24
+ $VERSION = '1.44';
25
25
 
26
26
  sub ProcessFPX($$);
27
27
  sub ProcessFPXR($$$);
@@ -488,16 +488,27 @@ my %fpxFileType = (
488
488
  IeImg => {
489
489
  Name => 'EmbeddedImage',
490
490
  Notes => q{
491
- embedded images in Scene7 vignette VNT files. EmbeddedImageRectangle is
492
- generated for applicable images, and may be associated with the
493
- corresponding EmbeddedImage via the family 3 group name
491
+ embedded images in Scene7 vignette VNT files. The EmbeddedImage Class and
492
+ Rectangle are also extracted for applicable images, and may be associated
493
+ with the corresponding EmbeddedImage via the family 3 group name
494
494
  },
495
495
  Groups => { 2 => 'Preview' },
496
496
  Binary => 1,
497
497
  },
498
- IeImg_rect => { # (not a real tag -- extracted from Contents of VNT file)
498
+ IeImg_class => {
499
+ Name => 'EmbeddedImageClass',
500
+ Notes => q{
501
+ not a real tag. This information is extracted if available for the
502
+ corresponding EmbeddedImage from the Contents of a VNT file
503
+ },
504
+ # eg. "Cache", "Mask"
505
+ },
506
+ IeImg_rect => { #
499
507
  Name => 'EmbeddedImageRectangle',
500
- Hidden => 1,
508
+ Notes => q{
509
+ not a real tag. This information is extracted if available for the
510
+ corresponding EmbeddedImage from the Contents of a VNT file
511
+ },
501
512
  },
502
513
  );
503
514
 
@@ -1577,13 +1588,16 @@ sub ProcessContents($$$)
1577
1588
  pos($$dataPt) += $size;
1578
1589
  }
1579
1590
  $$et{IeImg_lkup} = { };
1580
- # - the byte after TargetRole1 is 0x0d or 0x11 for separate images in my samples,
1591
+ $$et{IeImg_class} = { };
1592
+ # - the byte before \x80 is 0x0d, 0x11 or 0x1f for separate images in my samples,
1581
1593
  # and 0x1c or 0x23 for inline masks
1582
- while ($$dataPt =~ /\x0bTargetRole1.\x80\0\0\x01.{4}(.{24})/sg) {
1583
- my ($index, @coords) = unpack('Vx4V4', $1);
1594
+ # - the byte after \xff\xff is 0x3b in my samples for $1 containing 'VnMask' or 'VnCache'
1595
+ while ($$dataPt =~ /\x0bTargetRole1(?:.\x80|\xff\xff.\0.\0Vn(\w+))\0\0\x01.{4}(.{24})/sg) {
1596
+ my ($index, @coords) = unpack('Vx4V4', $2);
1584
1597
  next if $index == 0xffffffff;
1585
1598
  $$et{IeImg_lkup}{$index} and $et->WarnOnce('Duplicate image index');
1586
1599
  $$et{IeImg_lkup}{$index} = "@coords";
1600
+ $$et{IeImg_class}{$index} = $1 if $1;
1587
1601
  }
1588
1602
  }
1589
1603
  }
@@ -2395,6 +2409,10 @@ sub ProcessFPX($$)
2395
2409
  # save position of this image
2396
2410
  $et->HandleTag($tagTablePtr, IeImg_rect => $$et{IeImg_lkup}{$num});
2397
2411
  delete $$et{IeImg_lkup}{$num};
2412
+ if ($$et{IeImg_class} and $$et{IeImg_class}{$num}) {
2413
+ $et->HandleTag($tagTablePtr, IeImg_class => $$et{IeImg_class}{$num});
2414
+ delete $$et{IeImg_class}{$num};
2415
+ }
2398
2416
  }
2399
2417
  delete $$et{DOC_NUM};
2400
2418
  } else {
@@ -13,7 +13,7 @@ use vars qw($VERSION);
13
13
  use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::XMP;
15
15
 
16
- $VERSION = '1.00';
16
+ $VERSION = '1.01';
17
17
 
18
18
  %Image::ExifTool::LIF::Main = (
19
19
  GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
@@ -30,7 +30,15 @@ $VERSION = '1.00';
30
30
  my $unixTimeZero = 134774 * 24 * 3600;
31
31
  my @vals = split ' ', $val;
32
32
  foreach (@vals) {
33
- $_ = 1e-7 * hex($_);
33
+ if (/[^0-9a-f]/i) {
34
+ $_ = '0000:00:00 00:00:00';
35
+ } elsif (length $_ > 8) {
36
+ my $lo = hex substr($_, -8);
37
+ my $hi = hex substr($_, 0, -8);
38
+ $_ = 1e-7 * ($hi * 4294967296 + $lo);
39
+ } else {
40
+ $_ = 1e-7 * hex($_);
41
+ }
34
42
  # shift from Jan 1, 1601 to Jan 1, 1970
35
43
  $_ = Image::ExifTool::ConvertUnixTime($_ - $unixTimeZero);
36
44
  }
@@ -17,7 +17,7 @@ use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
  use Image::ExifTool::Minolta;
19
19
 
20
- $VERSION = '1.16';
20
+ $VERSION = '1.17';
21
21
 
22
22
  sub ProcessMRW($$;$);
23
23
  sub WriteMRW($$;$);
@@ -489,6 +489,14 @@ sub ProcessMRW($$;$)
489
489
  $err and $et->Error("MRW format error", $$et{TIFF_TYPE} eq 'ARW');
490
490
  } else {
491
491
  $err and $et->Warn("MRW format error");
492
+ if ($$et{ImageDataMD5}) {
493
+ my ($num, $md5) = (0, $$et{ImageDataMD5});
494
+ while ($raf->Read($data, 65536)) {
495
+ $md5->add($data);
496
+ $num += length $data;
497
+ }
498
+ $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $num bytes of raw data)\n");
499
+ }
492
500
  }
493
501
  return $rtnVal;
494
502
  }
@@ -64,7 +64,7 @@ use Image::ExifTool::Exif;
64
64
  use Image::ExifTool::GPS;
65
65
  use Image::ExifTool::XMP;
66
66
 
67
- $VERSION = '4.20';
67
+ $VERSION = '4.21';
68
68
 
69
69
  sub LensIDConv($$$);
70
70
  sub ProcessNikonAVI($$$);
@@ -5298,6 +5298,7 @@ my %nikonFocalConversions = (
5298
5298
  35 => 'Nikkor Z 28-75mm f/2.8', #IB
5299
5299
  36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
5300
5300
  37 => 'Nikkor Z 600mm f/4 TC VR S', #28
5301
+ 38 => 'Nikkor Z 85mm f/1.2 S', #28
5301
5302
  39 => 'Nikkor Z 17-28mm f/2.8', #IB
5302
5303
  32768 => 'Nikkor Z 400mm f/2.8 TC VR S TC-1.4x', #28
5303
5304
  32769 => 'Nikkor Z 600mm f/4 TC VR S TC-1.4x', #28
@@ -11836,19 +11837,19 @@ sub ProcessNikonApp($;$)
11836
11837
  my $trailerLen = unpack('N', $buff);
11837
11838
  $trailerLen > $fileEnd and $et->Warn('Bad NikonApp trailer size'), return 0;
11838
11839
  if ($dirInfo) {
11839
- $$dirInfo{DirLen} = $trailerLen if $dirInfo;
11840
+ $$dirInfo{DirLen} = $trailerLen;
11840
11841
  $$dirInfo{DataPos} = $fileEnd - $trailerLen;
11841
11842
  if ($$dirInfo{OutFile}) {
11842
11843
  if ($$et{DEL_GROUP}{NikonApp}) {
11844
+ $et->VPrint(0, " Deleting NikonApp trailer ($trailerLen bytes)\n");
11843
11845
  ++$$et{CHANGED};
11844
- # just copy the trailer when writing
11846
+ # just copy the trailer when writing (read directly into output buffer)
11845
11847
  } elsif ($trailerLen > $fileEnd or not $raf->Seek($$dirInfo{DataPos}, 0) or
11846
11848
  $raf->Read(${$$dirInfo{OutFile}}, $trailerLen) != $trailerLen)
11847
11849
  {
11848
11850
  return 0;
11849
- } else {
11850
- return 1;
11851
11851
  }
11852
+ return 1;
11852
11853
  }
11853
11854
  $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
11854
11855
  }
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
40
40
  use Image::ExifTool::Exif;
41
41
  use Image::ExifTool::APP12;
42
42
 
43
- $VERSION = '2.80';
43
+ $VERSION = '2.81';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -3165,21 +3165,38 @@ my %indexInfo = (
3165
3165
  PrintHex => 1,
3166
3166
  ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
3167
3167
  ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
3168
- PrintConv => [
3168
+ PrintConv => [ # herb values added:
3169
+ # based on code of W.P. in https://exiftool.org/forum/index.php?topic=14144.0
3169
3170
  {
3170
- 0x00 => '(none)',
3171
- 0x01 => 'Center',
3171
+ # 0x00 => '(none)',
3172
+ # 0x01 => 'Center',
3172
3173
  # need to fill this in...
3174
+ 0x00 => '(none)',
3175
+ 0x02 => 'Top-center (horizontal)',
3176
+ 0x04 => 'Right (horizontal)',
3177
+ 0x05 => 'Mid-right (horizontal)',
3178
+ 0x06 => 'Center (horizontal)',
3179
+ 0x07 => 'Mid-left (horizontal)',
3180
+ 0x08 => 'Left (horizontal)',
3181
+ 0x0a => 'Bottom-center (horizontal)',
3182
+ 0x0c => 'Top-center (vertical)',
3183
+ 0x0f => 'Right (vertical)',
3184
+ 0x15 => 'Bottom-center (vertical)',
3185
+ 0x10 => 'Mid-right (vertical)',
3186
+ 0x11 => 'Center (vertical)',
3187
+ 0x12 => 'Mid-left (vertical)',
3188
+ 0x13 => 'Left (vertical)',
3173
3189
  },
3174
3190
  {
3175
3191
  0x00 => 'Single Target',
3176
3192
  0x40 => 'All Target', # (guess)
3177
3193
  },
3178
3194
  ]
3179
- },{ #11
3195
+ },{ #herb all camera model except E-Mxxx and OM-x
3180
3196
  Name => 'AFPoint',
3197
+ Condition => '$$self{Model} !~ /^(E-M|OM-)/ ',
3181
3198
  Writable => 'int16u',
3182
- Notes => 'other models',
3199
+ Notes => 'models other than E-Mxxx and OM-x',
3183
3200
  RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef',
3184
3201
  PrintConv => {
3185
3202
  # (E-P1 always writes 0, maybe other models do too - PH)
@@ -3189,10 +3206,73 @@ my %indexInfo = (
3189
3206
  3 => 'Center (vertical)', #6 (E-510)
3190
3207
  255 => 'None',
3191
3208
  },
3209
+ },{ #herb all newer models E-Mxxx and OM-x; we do not know details
3210
+ Name => 'AFPoint',
3211
+ Writable => 'int16u',
3212
+ Notes => 'other models',
3192
3213
  }
3193
3214
  ],
3194
3215
  # 0x31a Continuous AF parameters?
3195
- # 0x31b ContinuousFocusMode? (ref forum78245)
3216
+ 0x31b => [ #herb, based on investigations of abgestumpft: https://exiftool.org/forum/index.php?topic=14527.0
3217
+ # for newer models E-Mxxx and OM-x
3218
+ {
3219
+ Name => 'AFPointDetails',
3220
+ Condition => '$$self{Model} =~ m/^E-M|^OM-/ ',
3221
+ Writable => 'int16u',
3222
+ Notes => 'models E-Mxxx and OM-x',
3223
+ PrintHex => 1,
3224
+ ValueConv => '(($val >> 13) & 0x7) . " " . (($val >> 12) & 0x1) . " " . (($val >> 11) & 0x1) . " " .
3225
+ # subject detect face and eye half press
3226
+ (($val >> 8) & 0x3) . " " . (($val >> 7) & 0x1) . " " . (($val >> 5) & 0x1) . " " .
3227
+ # eye AF face detect x-AF with MF
3228
+ (($val >> 4) & 0x1) . " " . (($val >> 3) & 0x1) . " " . ($val & 0x7)',
3229
+ # release object found MF...
3230
+ PrintConvColumns => 4,
3231
+ PrintConv => [
3232
+ {
3233
+ # should be identical to AISubjectTrackingMode
3234
+ 0 => 'No Subject Detection',
3235
+ 1 => 'Motorsports',
3236
+ 2 => 'Airplanes',
3237
+ 3 => 'Trains',
3238
+ 4 => 'Birds',
3239
+ 5 => 'Dogs & Cats',
3240
+ },{
3241
+ 0 => 'Face Priority',
3242
+ 1 => 'Target Priority',
3243
+ },{
3244
+ 0 => 'Normal AF',
3245
+ 1 => 'AF on Half Press',
3246
+ },{
3247
+ 0 => 'No Eye-AF',
3248
+ 1 => 'Right Eye Priority',
3249
+ 2 => 'Left Eye Priority',
3250
+ 3 => 'Both Eyes Priority',
3251
+ },{
3252
+ 0 => 'No Face Detection',
3253
+ 1 => 'Face Detection',
3254
+ },{
3255
+ 0 => 'No MF',
3256
+ 1 => 'With MF',
3257
+ },{
3258
+ 0 => 'AF Priority',
3259
+ 1 => 'Release Priority',
3260
+ },{
3261
+ 0 => 'No Object found',
3262
+ 1 => 'Object found',
3263
+ },{
3264
+ 0 => 'MF',
3265
+ 1 => 'S-AF',
3266
+ 2 => 'C-AF',
3267
+ 6 => 'C-AF + TR',
3268
+ },
3269
+ ],
3270
+ },{ # for older models
3271
+ Name => 'AFPointDetails',
3272
+ Writable => 'int16u',
3273
+ Notes => 'other models',
3274
+ }
3275
+ ],
3196
3276
  0x328 => { #PH
3197
3277
  Name => 'AFInfo',
3198
3278
  SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AFInfo' },