exiftool_vendored 12.58.0 → 12.59.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 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' },