exiftool_vendored 13.34.0 → 13.36.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: ee6400c2f7784efecc62e0876ee90696b3f523abbf6438ee5d3c60e56574ca11
4
- data.tar.gz: 33c0b5f6228fc949cead6b4d357117227b7f5fe74a98cef2377cbfca6c8e9753
3
+ metadata.gz: 48115655191684a1376bb6803a1831f0364e3561b84fef9227979c762d840a9f
4
+ data.tar.gz: f8297fca14ffbfb66f8c5eca245f8096a940df011ae4a41dbe6ce4120c34b90b
5
5
  SHA512:
6
- metadata.gz: 50d16f2dfe3be3a2c117f72f244da5b762fb7f876fec921e32f7347f002f50de235da85949121cde69175b9b0a6aa11094e80d7e3a720207c422c750f748a0f1
7
- data.tar.gz: 5cc1844f04cf8a423af7e7e79403b9e817389cf7b357a482a64fa8c693d9b230018c090dcd722a9b9161e2df35184a421c5db984a2805033fc3e0b3e082b964b
6
+ metadata.gz: 3a122b46c9c3a876d70c732db1e2e5c7e039c7d1c7cf4735c41a1ceac1384a4ce4f9f42a04c7156932e105fbc8bfa3cef366f9fd17452ecb6fab41f78247f2f3
7
+ data.tar.gz: 6b105de18581c29ea2c56882113ada5e8519861f575e37be65282db903a6d49812c6b0b544d1bf3c3e1f35fb34bc9633bfd798b852e79c6020a113767c2db65d
data/bin/Changes CHANGED
@@ -4,9 +4,40 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 13.30. (Other versions are
7
+ Note: The most recent production release is Version 13.36. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Sept. 9, 2025 - Version 13.36 (production release)
11
+
12
+ - Added a new Nikon LensID (thanks Max, github #345)
13
+ - Added new Sony and Pentax camera ID's (thanks Hubert Figuiere, github #347)
14
+ - Tolerate 'junk' after 'WAVE' chunk in LA, PAC, OFR and WV audio files
15
+ - Use gnu tar 1.35 to build the .tar.gz distribution package (versions
16
+ 13.31-13.35 used bsdtar 3.5.3, and earlier versions used bsdtar 2.8.3)
17
+
18
+ Sept. 6, 2025 - Version 13.35 (production release)
19
+
20
+ - Added a new CanonModelID
21
+ - Added new Olympus PictureMode and LensType values (thanks Michael Meissner)
22
+ - Decode GPS from another DJI protobuf format (DJI Neo)
23
+ - Decode a few new FujiFilm tags
24
+ - Enhanced -ee option to extract M-RAW information from all images in FujiFilm
25
+ RAF files
26
+ - Improved handling of standard-format unknown XMP date/time tags when the API
27
+ XMPAutoConv option is set (which is the default) to put them in the "Time"
28
+ group and apply the -d date/time formatting
29
+ - Improved -fileNUM option so it may be used to access tags from alternate
30
+ files when the specified target FILE doesn't exist
31
+ - Improved print conversions for some Canon tags to handle "n/a" values
32
+ - Enhanced JSON long output (-j -l) so the API SaveBin option also returns the
33
+ Rational ("rat") value if available
34
+ - Changed -if option so the expression is evaluated even when the source file
35
+ doesn't exist (to allow more flexibily when using -fileNUM option or when
36
+ creating the output file when writing)
37
+ - Fixed decoding of a few new Pentax tags (thanks Karsten Gieselmann)
38
+ - Fixed -diff feature to report differences in binary-data values and to be
39
+ consistent with handling of backslashes in Windows path names
40
+
10
41
  Aug. 18, 2025 - Version 13.34
11
42
 
12
43
  - Decode a number of new Pentax tags (thanks Karsten Gieselmann)
data/bin/META.json CHANGED
@@ -50,6 +50,6 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.34",
53
+ "version" : "13.36",
54
54
  "x_serialization_backend" : "JSON::PP version 4.06"
55
55
  }
data/bin/META.yml CHANGED
@@ -31,5 +31,5 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.34'
34
+ version: '13.36'
35
35
  x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
data/bin/Makefile.PL CHANGED
@@ -46,6 +46,7 @@ WriteMakefile(
46
46
  },
47
47
  } ) : ()),
48
48
  clean => { FILES => 't/*.tmp' },
49
+ dist => { TAR => 'gtar' },
49
50
  EXE_FILES => [ 'exiftool' ],
50
51
  ($] >= 5.005 ?
51
52
  (ABSTRACT_FROM => $ExifTool_pod,
data/bin/README CHANGED
@@ -110,8 +110,8 @@ your home directory, then you would type the following commands in a
110
110
  terminal window to extract and run ExifTool:
111
111
 
112
112
  cd ~/Desktop
113
- gzip -dc Image-ExifTool-13.34.tar.gz | tar -xf -
114
- cd Image-ExifTool-13.34
113
+ gzip -dc Image-ExifTool-13.36.tar.gz | tar -xf -
114
+ cd Image-ExifTool-13.36
115
115
  ./exiftool t/images/ExifTool.jpg
116
116
 
117
117
  Note: These commands extract meta information from one of the test images.
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.34';
14
+ my $version = '13.36';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -57,7 +57,7 @@ sub FormatJSON($$$;$);
57
57
  sub PrintCSV(;$);
58
58
  sub AddGroups($$$$);
59
59
  sub ConvertBinary($);
60
- sub IsEqual($$);
60
+ sub IsEqual($$;$);
61
61
  sub Printable($);
62
62
  sub LengthUTF8($);
63
63
  sub Infile($;$);
@@ -969,6 +969,7 @@ for (;;) {
969
969
  if (/^diff$/i) {
970
970
  $diff = shift;
971
971
  defined $diff or Error("Expecting file name for -$_ option\n"), $badCmd=1;
972
+ CleanFilename($diff); # change to forward slashes if necessary
972
973
  next;
973
974
  }
974
975
  /^delete_original(!?)$/i and $deleteOrig = ($1 ? 2 : 1), next;
@@ -2150,10 +2151,12 @@ sub GetImageInfo($$)
2150
2151
  # set alternate file names
2151
2152
  foreach $g8 (sort keys %altFile) {
2152
2153
  my $altName = $orig;
2153
- # must double any '$' symbols in the original file name because
2154
- # they are used for tag names in a -fileNUM argument
2155
- $altName =~ s/\$/\$\$/g;
2156
- $altName = FilenameSPrintf($altFile{$g8}, $altName);
2154
+ unless ($altFile{$g8} eq '@') {
2155
+ # must double any '$' symbols in the original file name because
2156
+ # they are used for tag names in a -fileNUM argument
2157
+ $altName =~ s/\$/\$\$/g;
2158
+ $altName = FilenameSPrintf($altFile{$g8}, $altName);
2159
+ }
2157
2160
  $et->SetAlternateFile($g8, $altName);
2158
2161
  }
2159
2162
 
@@ -2178,15 +2181,7 @@ sub GetImageInfo($$)
2178
2181
  }
2179
2182
  # evaluate -if expression for conditional processing
2180
2183
  if (@condition) {
2181
- unless ($file eq '-' or $et->Exists($file)) {
2182
- Warn "Error: File not found - $file\n";
2183
- EFile($file);
2184
- FileNotFound($file);
2185
- ++$countBad;
2186
- return;
2187
- }
2188
2184
  my $result;
2189
-
2190
2185
  unless ($failCondition) {
2191
2186
  # catch run time errors as well as compile errors
2192
2187
  undef $evalWarning;
@@ -2225,7 +2220,10 @@ sub GetImageInfo($$)
2225
2220
  }
2226
2221
  undef @foundTags if $fastCondition; # ignore if we didn't get all tags
2227
2222
  }
2228
- unless ($result) {
2223
+ if ($result) {
2224
+ # discard $info for non-existent file
2225
+ undef $info unless $file eq '-' or $et->Exists($file);
2226
+ } else {
2229
2227
  Progress($vout, "-------- $file (failed condition)") if $verbose;
2230
2228
  EFile($file, 2);
2231
2229
  ++$countFailed;
@@ -2922,7 +2920,7 @@ TAG: foreach $tag (@foundTags) {
2922
2920
  $val = $et->GetValue($tag, 'ValueConv');
2923
2921
  $val = '' unless defined $val;
2924
2922
  # go back to print ValueConv value only if different
2925
- next unless IsEqual($val, $lastVal);
2923
+ next unless IsEqual($val, $lastVal, 1);
2926
2924
  print $fp "$descClose\n </$tok>";
2927
2925
  last;
2928
2926
  }
@@ -2959,7 +2957,7 @@ TAG: foreach $tag (@foundTags) {
2959
2957
  $$val{desc} = $desc;
2960
2958
  if ($printConv) {
2961
2959
  my $num = $et->GetValue($tag, 'ValueConv');
2962
- $$val{num} = $num if defined $num and not IsEqual($num, $$val{val});
2960
+ $$val{num} = $num if defined $num and not IsEqual($num, $$val{val}, 1);
2963
2961
  }
2964
2962
  my $ex = $$et{TAG_EXTRA}{$tag};
2965
2963
  $$val{'fmt'} = $$ex{G6} if defined $$ex{G6};
@@ -2972,6 +2970,7 @@ TAG: foreach $tag (@foundTags) {
2972
2970
  $$val{'hex'} = join ' ', unpack '(H2)*', $$ex{BinVal};
2973
2971
  }
2974
2972
  }
2973
+ $$val{rat} = $$ex{Rational} if defined $$ex{Rational} and $$et{OPTIONS}{SaveBin};
2975
2974
  }
2976
2975
  }
2977
2976
  FormatJSON($fp, $val, $ind, $quote);
@@ -3945,24 +3944,29 @@ sub ConvertBinary($)
3945
3944
 
3946
3945
  #------------------------------------------------------------------------------
3947
3946
  # Compare ValueConv and PrintConv values of a tag to see if they are equal
3948
- # Inputs: 0) value1, 1) value2
3947
+ # Inputs: 0) value1, 1) value2, 2) flag to return true for any scalar references
3949
3948
  # Returns: true if they are equal
3950
- sub IsEqual($$)
3949
+ sub IsEqual($$;$)
3951
3950
  {
3952
- my ($a, $b) = @_;
3951
+ my ($a, $b, $trueScalar) = @_;
3953
3952
  # (scalar values are not print-converted)
3954
- return 1 if $a eq $b or ref $a eq 'SCALAR';
3953
+ return 1 if $a eq $b;
3954
+ if (ref $a eq 'SCALAR') {
3955
+ return 1 if $trueScalar;
3956
+ return 1 if ref $b eq 'SCALAR' and $$a eq $$b;
3957
+ return 0;
3958
+ }
3955
3959
  if (ref $a eq 'HASH' and ref $b eq 'HASH') {
3956
3960
  return 0 if scalar(keys %$a) != scalar(keys %$b);
3957
3961
  my $key;
3958
3962
  foreach $key (keys %$a) {
3959
- return 0 unless IsEqual($$a{$key}, $$b{$key});
3963
+ return 0 unless IsEqual($$a{$key}, $$b{$key}, $trueScalar);
3960
3964
  }
3961
3965
  } else {
3962
3966
  return 0 if ref $a ne 'ARRAY' or ref $b ne 'ARRAY' or @$a != @$b;
3963
3967
  my $i;
3964
3968
  for ($i=0; $i<scalar(@$a); ++$i) {
3965
- return 0 unless IsEqual($$a[$i], $$b[$i]);
3969
+ return 0 unless IsEqual($$a[$i], $$b[$i], $trueScalar);
3966
3970
  }
3967
3971
  }
3968
3972
  return 1;
@@ -4380,7 +4384,7 @@ sub FindFileWindows($$)
4380
4384
  # recode file name as UTF-8 if necessary
4381
4385
  my $enc = $et->Options('CharsetFileName');
4382
4386
  $wildfile = $et->Decode($wildfile, $enc, undef, 'UTF8') if $enc and $enc ne 'UTF8';
4383
- $wildfile =~ tr/\\/\//; # use forward slashes
4387
+ CleanFilename($wildfile); # use forward slashes
4384
4388
  my ($dir, $wildname) = ($wildfile =~ m{(.*[:/])(.*)}) ? ($1, $2) : ('', $wildfile);
4385
4389
  if (HasWildcards($dir)) {
4386
4390
  Warn "Wildcards don't work in the directory specification\n";
@@ -4460,7 +4464,7 @@ sub AbsPath($)
4460
4464
  local $SIG{'__WARN__'} = sub { };
4461
4465
  $path = eval { Cwd::abs_path($file) };
4462
4466
  }
4463
- $path =~ tr/\\/\// if $^O eq 'MSWin32' and defined $path; # use forward slashes
4467
+ CleanFilename($path) if defined $path; # use forward slashes
4464
4468
  }
4465
4469
  return $path;
4466
4470
  }
@@ -5901,13 +5905,15 @@ Adding the B<-D> or B<-H> option changes tag values to JSON objects with
5901
5905
  "val" and "id" fields. Adding B<-l> adds a "desc" field, and a "num" field
5902
5906
  if the numerical value is different from the converted "val", and "fmt" and
5903
5907
  "hex" fields for EXIF metadata if the API SaveFormat and SaveBin options are
5904
- set respectively, and the length of the "hex" output is limited by the API
5905
- LimitLongValues setting. The B<-b> option may be added to output binary
5906
- data, encoded in base64 if necessary (indicated by ASCII "base64:" as the
5907
- first 7 bytes of the value), and B<-t> may be added to include tag table
5908
- information (see B<-t> for details). The JSON output is UTF-8 regardless of
5909
- any B<-L> or B<-charset> option setting, but the UTF-8 validation is
5910
- disabled if a character set other than UTF-8 is specified.
5908
+ set respectively. The length of the "hex" output is limited by the API
5909
+ LimitLongValues setting. Setting the SaveBin option also causes the
5910
+ original values of Rational tags to be returned in string form as an extra
5911
+ "rat" field. The B<-b> option may be added to output binary data, encoded
5912
+ in base64 if necessary (indicated by ASCII "base64:" as the first 7 bytes of
5913
+ the value), and B<-t> may be added to include tag table information (see
5914
+ B<-t> for details). The JSON output is UTF-8 regardless of any B<-L> or
5915
+ B<-charset> option setting, but the UTF-8 validation is disabled if a
5916
+ character set other than UTF-8 is specified.
5911
5917
 
5912
5918
  Note that ExifTool quotes JSON values only if they don't look like numbers
5913
5919
  (regardless of the original storage format or the relevant metadata
@@ -6076,7 +6082,7 @@ with this command:
6076
6082
 
6077
6083
  produces output like this:
6078
6084
 
6079
- -- Generated by ExifTool 13.34 --
6085
+ -- Generated by ExifTool 13.36 --
6080
6086
  File: a.jpg - 2003:10:31 15:44:19
6081
6087
  (f/5.6, 1/60s, ISO 100)
6082
6088
  File: b.jpg - 2006:05:23 11:57:38
@@ -7173,6 +7179,10 @@ Subtle note: If a B<-tagsFromFile> option is used, tags in the I<ALTFILE>
7173
7179
  argument come from the I<SRCFILE> that applies to the first argument
7174
7180
  accessing tags from the corresponding C<FileNUM> group.
7175
7181
 
7182
+ I<ALTFILE> may also be C<@> to access tags from the specified I<FILE>, which
7183
+ may be useful when the B<-srcfile> option is used to process a different
7184
+ source file.
7185
+
7176
7186
  User-defined Composite tags may access tags from alternate files using the
7177
7187
  appropriate (case-sensitive) family 8 group name.
7178
7188
 
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.95';
91
+ $VERSION = '4.96';
92
92
 
93
93
  # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
94
94
  # (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -1006,6 +1006,7 @@ $VERSION = '4.95';
1006
1006
  0x80000491 => 'PowerShot V10', #25
1007
1007
  0x80000495 => 'EOS R1', #PH
1008
1008
  0x80000496 => 'R5 Mark II', #forum16406
1009
+ 0x80000497 => 'PowerShot V1', #PH
1009
1010
  0x80000498 => 'EOS R100', #25
1010
1011
  0x80000516 => 'EOS R50 V', #42
1011
1012
  0x80000520 => 'EOS D2000C', #IB
@@ -9172,15 +9173,37 @@ my %filterConv = (
9172
9173
  Name => 'AFConfigTool',
9173
9174
  ValueConv => '$val + 1',
9174
9175
  ValueConvInv => '$val - 1',
9175
- PrintConv => '"Case $val"',
9176
- PrintConvInv => '$val=~/(\d+)/ ? $1 : undef',
9176
+ PrintHex => 1,
9177
+ PrintConv => {
9178
+ 0x80000000 => 'n/a',
9179
+ OTHER => sub { 'Case ' . shift },
9180
+ },
9181
+ PrintConvInv => '$val=~/(\d+)/ ? $1 : 0x80000000',
9182
+ },
9183
+ 2 => {
9184
+ Name => 'AFTrackingSensitivity',
9185
+ PrintHex => 1,
9186
+ PrintConv => {
9187
+ 0x7fffffff => 'n/a',
9188
+ OTHER => sub { shift },
9189
+ },
9177
9190
  },
9178
- 2 => 'AFTrackingSensitivity',
9179
9191
  3 => {
9180
9192
  Name => 'AFAccelDecelTracking',
9181
9193
  Description => 'AF Accel/Decel Tracking',
9194
+ PrintHex => 1,
9195
+ PrintConv => {
9196
+ 0x7fffffff => 'n/a',
9197
+ OTHER => sub { shift },
9198
+ },
9199
+ },
9200
+ 4 => {
9201
+ Name => 'AFPointSwitching',
9202
+ PrintConv => {
9203
+ 0x7fffffff => 'n/a',
9204
+ OTHER => sub { shift },
9205
+ },
9182
9206
  },
9183
- 4 => 'AFPointSwitching',
9184
9207
  5 => { #52
9185
9208
  Name => 'AIServoFirstImage',
9186
9209
  PrintConv => {
@@ -18,7 +18,7 @@ use Image::ExifTool::XMP;
18
18
  use Image::ExifTool::GPS;
19
19
  use Image::ExifTool::Protobuf;
20
20
 
21
- $VERSION = '1.14';
21
+ $VERSION = '1.15';
22
22
 
23
23
  sub ProcessDJIInfo($$$);
24
24
  sub ProcessSettings($$$);
@@ -30,6 +30,8 @@ sub ProcessSettings($$$);
30
30
  'dvtm_wm265e.proto' => 1, # Mavic 3
31
31
  'dvtm_pm320.proto' => 1, # Matrice 30
32
32
  'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
33
+ 'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
34
+ 'dvtm_dji_neo.proto' => 1, # Neo
33
35
  );
34
36
 
35
37
  my %convFloat2 = (
@@ -234,13 +236,14 @@ my %convFloat2 = (
234
236
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
235
237
  which use the following protocols: dvtm_AVATA2.proto (Avata 2),
236
238
  dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
237
- dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
238
- dvtm_pm320.proto (Mini 4 Pro).
239
+ dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30),
240
+ dvtm_Mini4_Pro.proto (Mini 4 Pro) and dvtm_dji_neo.proto (DJI Neo).
239
241
 
240
242
  Note that with the protobuf format, numerical tags missing from the output
241
243
  for a given protocol should be considered to have the default value of 0.
242
244
  },
243
245
  Protocol => {
246
+ Notes => "typically protobuf field 1-1-1, but ExifTool doesn't rely on this",
244
247
  RawConv => q{
245
248
  unless ($Image::ExifTool::DJI::knownProtocol{$val}) {
246
249
  $self->Warn("Unknown protocol $val (please submit sample for testing)");
@@ -475,6 +478,53 @@ my %convFloat2 = (
475
478
  Name => 'GimbalInfo',
476
479
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
477
480
  },
481
+ #
482
+ # DJI Neo (very similar to AVATA2)
483
+ #
484
+ # dvtm_dji_neo_1-1-2 - some version number
485
+ # dvtm_dji_neo_1-1-3 - some version number
486
+ 'dvtm_dji_neo_1-1-5' => { Name => 'SerialNumber', Notes => 'DJI Neo' }, # (NC)
487
+ 'dvtm_dji_neo_1-1-10' => 'Model',
488
+ # dvtm_dji_neo_2-2-1-4 - model code?
489
+ # dvtm_dji_neo_2-2-2-1 - some firmware version?
490
+ # dvtm_dji_neo_2-2-2-2 - some version number?
491
+ 'dvtm_dji_neo_2-2-3-1' => 'SerialNumber2', # (NC)
492
+ 'dvtm_dji_neo_2-3' => {
493
+ Name => 'FrameInfo',
494
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
495
+ },
496
+ # dvtm_dji_neo_3-1-1 - frame number (starting at 1)
497
+ 'dvtm_dji_neo_3-1-2' => { # (also 3-2-1-6 and 3-4-1-6)
498
+ Name => 'TimeStamp',
499
+ Groups => { 2 => 'Time' },
500
+ Format => 'unsigned',
501
+ # milliseconds, but I don't know what the zero is
502
+ ValueConv => '$val / 1e6',
503
+ },
504
+ # dvtm_dji_neo_3-2-1-4 - model code?
505
+ # dvtm_dji_neo_3-2-1-5 - frame rate?
506
+ 'dvtm_dji_neo_3-2-2-1' => { Name => 'ISO', Format => 'float' }, # (NC)
507
+ 'dvtm_dji_neo_3-2-4-1' => {
508
+ Name => 'ShutterSpeed',
509
+ Format => 'rational',
510
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
511
+ },
512
+ 'dvtm_dji_neo_3-2-6-1' => { Name => 'ColorTemperature', Format => 'unsigned' }, # (NC)
513
+ 'dvtm_dji_neo_3-2-10-1' => { # (NC)
514
+ Name => 'FNumber',
515
+ Format => 'rational',
516
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
517
+ },
518
+ # dvtm_dji_neo_3-4-1-4 - model code?
519
+ 'dvtm_dji_neo_3-4-3' => { # (NC)
520
+ Name => 'DroneInfo',
521
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
522
+ },
523
+ 'dvtm_dji_neo_3-4-4-1' => {
524
+ Name => 'GPSInfo',
525
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
526
+ },
527
+ 'dvtm_dji_neo_3-4-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' }, # (NC)
478
528
  );
479
529
 
480
530
  %Image::ExifTool::DJI::DroneInfo = (
@@ -502,6 +552,7 @@ my %convFloat2 = (
502
552
  1 => { Name => 'FrameWidth', Format => 'unsigned' },
503
553
  2 => { Name => 'FrameHeight', Format => 'unsigned' },
504
554
  3 => { Name => 'FrameRate', Format => 'float' },
555
+ # 4-8: seen these values respectively for DJI Neo: 1,8,4,1,4
505
556
  );
506
557
 
507
558
  %Image::ExifTool::DJI::GPSInfo = (
@@ -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.98';
34
+ $VERSION = '1.99';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -426,6 +426,16 @@ my %faceCategories = (
426
426
  0x300 => 'DR (Dynamic Range priority)',
427
427
  },
428
428
  },
429
+ 0x1037 => { #forum17591
430
+ Name => 'MultipleExposure',
431
+ Writable => 'int16u', # (NC)
432
+ PrintConv => {
433
+ 1 => 'Additive',
434
+ 2 => 'Average',
435
+ 3 => 'Light',
436
+ 4 => 'Dark',
437
+ },
438
+ },
429
439
  0x1040 => { #8
430
440
  Name => 'ShadowTone',
431
441
  Writable => 'int32s',
@@ -586,16 +596,44 @@ my %faceCategories = (
586
596
  Name => 'SequenceNumber',
587
597
  Writable => 'int16u',
588
598
  },
599
+ 0x1102 => { #forum17602
600
+ Name => 'WhiteBalanceBracketing',
601
+ Writable => 'int16u', # (NC)
602
+ PrintHex => 1,
603
+ PrintConv => {
604
+ 0x01ff => '+/- 1',
605
+ 0x02ff => '+/- 2',
606
+ 0x03ff => '+/- 3',
607
+ },
608
+ },
589
609
  0x1103 => {
590
610
  Name => 'DriveSettings',
591
611
  SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::DriveSettings' },
592
612
  },
593
613
  0x1105 => { Name => 'PixelShiftShots', Writable => 'int16u' }, #IB
594
614
  0x1106 => { Name => 'PixelShiftOffset', Writable => 'rational64s', Count => 2 }, #IB
595
- # (0x1150-0x1152 exist only for Pro Low-light and Pro Focus PictureModes)
596
- # 0x1150 - Pro Low-light - val=1; Pro Focus - val=2 (ref 7); HDR - val=128 (forum10799)
597
- # 0x1151 - Pro Low-light - val=4 (number of pictures taken?); Pro Focus - val=2,3 (ref 7); HDR - val=3 (forum10799)
598
- # 0x1152 - Pro Low-light - val=1,3,4 (stacked pictures used?); Pro Focus - val=1,2 (ref 7); HDR - val=3 (forum10799)
615
+ 0x1150 => {
616
+ Name => 'CompositeImageMode',
617
+ Writable => 'int32u',
618
+ PrintConv => {
619
+ 0 => 'n/a', #PH
620
+ 1 => 'Pro Low-light', #7
621
+ 2 => 'Pro Focus', #7
622
+ 32 => 'Panorama', #PH
623
+ 128 => 'HDR', #forum10799
624
+ 1024 => 'Multi-exposure', #forum17591
625
+ },
626
+ },
627
+ 0x1151 => {
628
+ Name => 'CompositeImageCount1',
629
+ Writable => 'int16u',
630
+ # Pro Low-light - val=4 (number of pictures taken?); Pro Focus - val=2,3 (ref 7); HDR - val=3 (forum10799)
631
+ },
632
+ 0x1152 => {
633
+ Name => 'CompositeImageCount2',
634
+ Writable => 'int16u',
635
+ # Pro Low-light - val=1,3,4 (stacked pictures used?); Pro Focus - val=1,2 (ref 7); HDR - val=3 (forum10799)
636
+ },
599
637
  0x1153 => { #forum7668
600
638
  Name => 'PanoramaAngle',
601
639
  Writable => 'int16u',
@@ -605,8 +643,8 @@ my %faceCategories = (
605
643
  Writable => 'int16u',
606
644
  PrintConv => {
607
645
  1 => 'Right',
608
- 2 => 'Up',
609
- 3 => 'Left',
646
+ 2 => 'Up', # (or Left?, forum17591)
647
+ 3 => 'Left', # (or Up?, forum17591)
610
648
  4 => 'Down',
611
649
  },
612
650
  },
@@ -1558,20 +1596,21 @@ my %faceCategories = (
1558
1596
  TAG_PREFIX => 'MRAW',
1559
1597
  NOTES => q{
1560
1598
  Tags extracted from the M-RAW header of multi-image RAF files. The family 1
1561
- group name for these tags is "M-RAW".
1562
- },
1563
- 1 => { Name => 'RawImageNumber', Format => 'int32u' },
1564
- # 3 - seen "0 100", "-300 100" and "300 100" for a sequence of 3 images
1565
- 3 => { Name => 'ExposureCompensation', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
1566
- # 4 - (same value as 3 in all my samples)
1567
- 4 => { Name => 'ExposureCompensation2', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
1568
- # 5 - seen "10 1600", "10 6800", "10 200", "10 35000" etc
1569
- 5 => { Name => 'ExposureTime', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)' },
1570
- # 6 - seen "450 100", "400 100" (all images in RAF have same value)
1571
- 6 => { Name => 'FNumber', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)' },
1572
- # 7 - seen 200, 125, 250, 2000
1573
- 7 => 'ISO',
1574
- # 8 - seen 0, 65536
1599
+ group name for these tags is "M-RAW". Additional metadata may be extracted
1600
+ from the embedded RAW images with the ExtractEmbedded option.
1601
+ },
1602
+ 0x2001 => { Name => 'RawImageNumber', Format => 'int32u' },
1603
+ # 0x2003 - seen "0 100", "-300 100" and "300 100" for a sequence of 3 images
1604
+ 0x2003 => { Name => 'ExposureCompensation', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
1605
+ # 0x2004 - (same value as 3 in all my samples)
1606
+ 0x2004 => { Name => 'ExposureCompensation2', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
1607
+ # 0x2005 - seen "10 1600", "10 6800", "10 200", "10 35000" etc
1608
+ 0x2005 => { Name => 'ExposureTime', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)' },
1609
+ # 0x2006 - seen "450 100", "400 100" (all images in RAF have same value)
1610
+ 0x2006 => { Name => 'FNumber', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)' },
1611
+ # 0x2007 - seen 200, 125, 250, 2000
1612
+ 0x2007 => 'ISO',
1613
+ # 0x2008 - seen 0, 65536
1575
1614
  );
1576
1615
 
1577
1616
  #------------------------------------------------------------------------------
@@ -1684,6 +1723,7 @@ sub ProcessFujiDir($$$)
1684
1723
  sub ProcessMRAW($$$)
1685
1724
  {
1686
1725
  my ($et, $dirInfo, $tagTablePtr) = @_;
1726
+ return 1 if $$et{DOC_NUM};
1687
1727
  my $dataPt = $$dirInfo{DataPt};
1688
1728
  my $dataPos = $$dirInfo{DataPos};
1689
1729
  my $dataLen = length $$dataPt;
@@ -1697,15 +1737,16 @@ sub ProcessMRAW($$$)
1697
1737
  my $pos = 44;
1698
1738
  my ($i, $n);
1699
1739
  for ($n=0; ; ++$n) {
1700
- $pos += 16; # skip offset/size fields
1701
- my $end = $pos + $size;
1740
+ my $end = $pos + 16 + $size;
1702
1741
  last if $end > $dataLen;
1742
+ my $rafStart = Get64u($dataPt, $pos);
1743
+ my $rafLen = Get64u($dataPt, $pos+8);
1744
+ $pos += 16; # skip offset/size fields
1703
1745
  $$et{DOC_NUM} = ++$$et{DOC_COUNT} if $pos > 60;
1704
1746
  $et->VPrint(0, "$$et{INDENT}(Raw image $n parameters: $size bytes, $num entries)\n");
1705
1747
  for ($i=0; $i<$num; ++$i) {
1706
1748
  last if $pos + 4 > $end;
1707
- # (don't know what the byte at the current $pos is for, value = 0x20)
1708
- my $tag = Get8u($dataPt, $pos+1);
1749
+ my $tag = Get16u($dataPt, $pos);
1709
1750
  my $size = Get16u($dataPt, $pos+2);
1710
1751
  $pos += 4;
1711
1752
  last if $pos + $size > $end;
@@ -1717,6 +1758,21 @@ sub ProcessMRAW($$$)
1717
1758
  );
1718
1759
  $pos += $size;
1719
1760
  }
1761
+ if ($rafStart and $et->Options('ExtractEmbedded')) {
1762
+ if ($et->Options('Verbose')) {
1763
+ my $msg = sprintf("$$et{INDENT}(RAW image $n data: Start=0x%x, Length=0x%x)\n",$rafStart,$rafLen);
1764
+ $et->VPrint(0, $msg);
1765
+ }
1766
+ my $raf = $$et{RAF};
1767
+ my $tell = $raf->Tell();
1768
+ my $order = GetByteOrder();
1769
+ my $fujiWidth = $$et{FujiWidth};
1770
+ $raf->Seek($rafStart, 0) or next;
1771
+ ProcessRAF($et, { RAF => $raf, Base => $rafStart });
1772
+ $$et{FujiWidth} = $fujiWidth;
1773
+ SetByteOrder($order);
1774
+ $raf->Seek($tell, 0);
1775
+ }
1720
1776
  }
1721
1777
  delete $$et{DOC_NUM};
1722
1778
  return 1;
@@ -1816,7 +1872,6 @@ sub WriteRAF($$)
1816
1872
  # make sure padding is only zero bytes (can be >100k for HS10)
1817
1873
  # (have seen non-null padding in X-Pro1)
1818
1874
  if ($buff =~ /[^\0]/) {
1819
- HexDump(\$buff);
1820
1875
  return 1 if $et->Error('Non-null bytes found in padding', 2);
1821
1876
  }
1822
1877
  }
@@ -1871,6 +1926,7 @@ sub ProcessRAF($$)
1871
1926
  my ($buff, $jpeg, $warn, $offset);
1872
1927
 
1873
1928
  my $raf = $$dirInfo{RAF};
1929
+ my $base = $$dirInfo{Base} || 0;
1874
1930
  $raf->Read($buff,0x70) == 0x70 or return 0;
1875
1931
  $buff =~ /^FUJIFILM/ or return 0;
1876
1932
  # get position and size of M-RAW header and jpeg preview
@@ -1878,13 +1934,13 @@ sub ProcessRAF($$)
1878
1934
  my ($jpos, $jlen) = unpack('x84NN', $buff);
1879
1935
  $jpos & 0x8000 and return 0;
1880
1936
  if ($jpos) {
1881
- $raf->Seek($jpos, 0) or return 0;
1937
+ $raf->Seek($jpos+$base, 0) or return 0;
1882
1938
  $raf->Read($jpeg, $jlen) == $jlen or return 0;
1883
1939
  }
1884
1940
  SetByteOrder('MM');
1885
- $et->SetFileType();
1941
+ $et->SetFileType() unless $$et{DOC_NUM};
1886
1942
  my $tbl = GetTagTable('Image::ExifTool::FujiFilm::RAFHeader');
1887
- $et->ProcessDirectory({ DataPt => \$buff, DirName => 'RAFHeader' }, $tbl);
1943
+ $et->ProcessDirectory({ DataPt => \$buff, DirName => 'RAFHeader', Base => $base }, $tbl);
1888
1944
 
1889
1945
  # extract information from embedded JPEG
1890
1946
  my %dirInfo = (
@@ -1892,21 +1948,22 @@ sub ProcessRAF($$)
1892
1948
  RAF => File::RandomAccess->new(\$jpeg),
1893
1949
  );
1894
1950
  if ($jpos) {
1895
- $$et{BASE} += $jpos;
1951
+ $$et{BASE} += $jpos + $base;
1896
1952
  my $ok = $et->ProcessJPEG(\%dirInfo);
1897
- $$et{BASE} -= $jpos;
1953
+ $$et{BASE} -= $jpos + $base;
1898
1954
  $et->FoundTag('PreviewImage', \$jpeg) if $ok;
1899
1955
  }
1900
1956
  # extract information from Fuji RAF and TIFF directories
1901
1957
  my ($rafNum, $ifdNum) = ('','');
1902
1958
  foreach $offset (0x48, 0x5c, 0x64, 0x78, 0x80) {
1903
1959
  last if $jpos and $offset >= $jpos;
1904
- unless ($raf->Seek($offset, 0) and $raf->Read($buff, 8)) {
1960
+ unless ($raf->Seek($offset+$base, 0) and $raf->Read($buff, 8)) {
1905
1961
  $warn = 1;
1906
1962
  last;
1907
1963
  }
1908
1964
  my ($start, $len) = unpack('N2',$buff);
1909
1965
  next unless $start;
1966
+ $start += $base;
1910
1967
  if ($offset == 0x64 or $offset == 0x80) {
1911
1968
  # parse FujiIFD directory
1912
1969
  %dirInfo = (
Binary file
@@ -32,7 +32,7 @@ use strict;
32
32
  use vars qw($VERSION);
33
33
  use Image::ExifTool qw(:DataAccess :Utils);
34
34
 
35
- $VERSION = '1.29';
35
+ $VERSION = '1.30';
36
36
 
37
37
  # program map table "stream_type" lookup (ref 6/1/9)
38
38
  my %streamType = (
@@ -557,7 +557,7 @@ sub ProcessM2TS($$)
557
557
  {
558
558
  my ($et, $dirInfo) = @_;
559
559
  my $raf = $$dirInfo{RAF};
560
- my ($buff, $pLen, $upkPrefix, $j, $fileType, $eof);
560
+ my ($buff, $pLen, $j, $fileType, $eof);
561
561
  my (%pmt, %pidType, %data, %sectLen, %packLen, %fromStart);
562
562
  my ($startTime, $endTime, $fwdTime, $backScan, $maxBack);
563
563
  my $verbose = $et->Options('Verbose');
@@ -570,10 +570,8 @@ sub ProcessM2TS($$)
570
570
  unless ($1) {
571
571
  $pLen = 188; # no timecode
572
572
  $fileType = 'M2T'; # (just as a way to tell there is no timecode)
573
- $upkPrefix = 'N';
574
573
  } else {
575
574
  $pLen = 192; # 188-byte transport packet + leading 4-byte timecode (ref 4)
576
- $upkPrefix = 'x4N';
577
575
  }
578
576
  my $prePos = $pLen - 188; # byte position of packet prefix
579
577
  my $readSize = 64 * $pLen; # size of our read buffer
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
65
65
  use Image::ExifTool::GPS;
66
66
  use Image::ExifTool::XMP;
67
67
 
68
- $VERSION = '4.50';
68
+ $VERSION = '4.51';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -583,6 +583,7 @@ sub GetAFPointGrid($$;$);
583
583
  '0E 4A 31 48 23 2D 0E 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)',
584
584
  'FE 48 37 5C 24 24 DF 0E' => 'Tamron SP 24-70mm f/2.8 Di VC USD (A007)', #24
585
585
  'CE 47 37 5C 25 25 DF 4E' => 'Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)', #forum9110
586
+ 'CE 00 37 5C 25 25 DF 4E' => 'Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)', #github345
586
587
  '45 41 37 72 2C 3C 48 02' => 'Tamron SP AF 24-135mm f/3.5-5.6 AD Aspherical (IF) Macro (190D)',
587
588
  '33 54 3C 5E 24 24 62 02' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09)',
588
589
  'FA 54 3C 5E 24 24 84 06' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)', #JD
@@ -41,7 +41,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
41
41
  use Image::ExifTool::Exif;
42
42
  use Image::ExifTool::APP12;
43
43
 
44
- $VERSION = '2.89';
44
+ $VERSION = '2.90';
45
45
 
46
46
  sub PrintLensInfo($$$);
47
47
 
@@ -117,6 +117,7 @@ my %olympusLensTypes = (
117
117
  '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB (also OM System M.Zuiko Digital ED 100-400mm F5.0-6.3 IS II", forum2833)
118
118
  '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
119
119
  '0 37 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0 Pro', #forum3833
120
+ '0 38 10' => 'Olympus M.Zuiko Digital ED 20mm F1.4 Pro',
120
121
  '0 39 10' => 'Olympus M.Zuiko Digital ED 90mm F3.5 Macro IS Pro', #forum3833
121
122
  '0 40 10' => 'Olympus M.Zuiko Digital ED 150-600mm F5.0-6.3', #forum15652
122
123
  # Sigma lenses
@@ -2252,12 +2253,15 @@ my %indexInfo = (
2252
2253
  5 => 'i-Enhance', #11
2253
2254
  6 => 'e-Portrait', #23
2254
2255
  7 => 'Color Creator', #23
2256
+ 8 => 'Underwater', #7
2255
2257
  9 => 'Color Profile 1', #23
2256
2258
  10 => 'Color Profile 2', #23
2257
2259
  11 => 'Color Profile 3', #23
2258
2260
  12 => 'Monochrome Profile 1', #23
2259
2261
  13 => 'Monochrome Profile 2', #23
2260
2262
  14 => 'Monochrome Profile 3', #23
2263
+ 17 => 'Art Mode', #7
2264
+ 18 => 'Monochrome Profile 4', #7
2261
2265
  256 => 'Monotone',
2262
2266
  512 => 'Sepia',
2263
2267
  }],
@@ -59,7 +59,7 @@ use Image::ExifTool::Exif;
59
59
  use Image::ExifTool::GPS;
60
60
  use Image::ExifTool::HP;
61
61
 
62
- $VERSION = '3.55';
62
+ $VERSION = '3.57';
63
63
 
64
64
  sub CryptShutterCount($$);
65
65
  sub PrintFilter($$$);
@@ -564,6 +564,7 @@ my %pentaxModelID = (
564
564
  0x1329a => 'GR IIIx', # (Ricoh)
565
565
  0x132b8 => 'KF', #github322 (Ricoh)
566
566
  0x132d6 => 'K-3 Mark III Monochrome', #github226 (Ricoh)
567
+ 0x132e0 => 'GR IV', #github347 (Ricoh)
567
568
  );
568
569
 
569
570
  # Pentax city codes - (PH, Optio WP)
@@ -5120,52 +5121,52 @@ my %binaryDataAttrs = (
5120
5121
  PrintConv => { 0 => 'Off', 1 => 'Short', 2 => 'Medium', 3 => 'Long' },
5121
5122
  },
5122
5123
  0x021f => { #KG
5123
- Name => 'FirstFrameActionInAFC',
5124
- Condition => '$$self{Model} =~ /K-3 Mark III/',
5125
- PrintConv => {
5126
- '0' => 'Auto',
5127
- '1' => 'Release Priority',
5128
- '2' => 'Focus Priority',
5129
- # there is at least another value '3' but I couldn't figure out the
5130
- # meaning. However, this occurs for a few AF-S captures, so it has
5131
- # no real practical meaning.
5132
- },
5124
+ Name => 'FirstFrameActionInAFC',
5125
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
5126
+ PrintConv => {
5127
+ '0' => 'Auto',
5128
+ '1' => 'Release Priority',
5129
+ '2' => 'Focus Priority',
5130
+ # there is at least another value '3' but I couldn't figure out the
5131
+ # meaning. However, this occurs for a few AF-S captures, so it has
5132
+ # no real practical meaning.
5133
+ },
5133
5134
  },
5134
5135
  0x0220 => { #KG
5135
- Name => 'ActionInAFCCont',
5136
- Condition => '$$self{Model} =~ /K-3 Mark III/',
5137
- PrintConv => {
5138
- '0' => 'Auto',
5139
- '1' => 'Focus Priority',
5140
- '2' => 'FPS Priority',
5141
- },
5136
+ Name => 'ActionInAFCCont',
5137
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
5138
+ PrintConv => {
5139
+ '0' => 'Auto',
5140
+ '1' => 'Focus Priority',
5141
+ '2' => 'FPS Priority',
5142
+ },
5142
5143
  },
5143
5144
  545 => { #KG
5144
- Name => 'AFCHold',
5145
- Condition => '$$self{Model} =~ /K-3 Mark III/',
5146
- Mask => 0x03,
5147
- PrintConv => { 0 => 'Low', 1 => 'Medium', 2 => 'High', 3 => 'Off' },
5145
+ Name => 'AFCHold',
5146
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
5147
+ Mask => 0x03,
5148
+ PrintConv => { 0 => 'Low', 1 => 'Medium', 2 => 'High', 3 => 'Off' },
5148
5149
  },
5149
5150
  545.1 => { #KG
5150
- Name => 'AFCSensitivity',
5151
+ Name => 'AFCPointTracking',
5151
5152
  Condition => '$$self{Model} =~ /K-3 Mark III/',
5152
5153
  Mask => 0x0c,
5153
- PrintConv => '5 - $val',
5154
- PrintConvInv => '5 - $val',
5154
+ PrintConv => { 0 => 'Type 1', 1 => 'Type 2', 2 => 'Type 3' },
5155
5155
  },
5156
5156
  545.2 => { #KG
5157
- Name => 'AFCPointTracking',
5157
+ Name => 'AFCSensitivity',
5158
5158
  Condition => '$$self{Model} =~ /K-3 Mark III/',
5159
5159
  Mask => 0x70,
5160
- PrintConv => { 0 => 'Type 1', 1 => 'Type 2', 2 => 'Type 3' },
5160
+ PrintConv => '5 - $val',
5161
+ PrintConvInv => '5 - $val',
5161
5162
  },
5162
5163
  0x0960 => { #KG
5163
- Name => 'SubjectRecognition',
5164
- Condition => '$$self{Model} =~ /K-3 Mark III/',
5165
- PrintConv => {
5166
- 0 => 'Off',
5167
- 1 => 'On',
5168
- },
5164
+ Name => 'SubjectRecognition',
5165
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
5166
+ PrintConv => {
5167
+ 0 => 'Off',
5168
+ 1 => 'On',
5169
+ },
5169
5170
  },
5170
5171
  );
5171
5172
 
@@ -18,7 +18,7 @@ use strict;
18
18
  use vars qw($VERSION);
19
19
  use Image::ExifTool qw(:DataAccess :Utils);
20
20
 
21
- $VERSION = '1.03';
21
+ $VERSION = '1.04';
22
22
 
23
23
  sub ProcessProtobuf($$$;$);
24
24
 
@@ -111,7 +111,7 @@ my %insvLimit = (
111
111
  The tags below are extracted from timed metadata in QuickTime and other
112
112
  formats of video files when the ExtractEmbedded option is used. Although
113
113
  most of these tags are combined into the single table below, ExifTool
114
- currently reads 110 different types of timed GPS metadata from video files.
114
+ currently reads 111 different types of timed GPS metadata from video files.
115
115
  },
116
116
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
117
117
  GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
@@ -30,7 +30,7 @@ use strict;
30
30
  use vars qw($VERSION $AUTOLOAD);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
 
33
- $VERSION = '1.71';
33
+ $VERSION = '1.72';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -2031,6 +2031,7 @@ sub ProcessRIFF($$)
2031
2031
  my $validate = $et->Options('Validate');
2032
2032
  my $ee = $et->Options('ExtractEmbedded');
2033
2033
  my $hash = $$et{ImageDataHash};
2034
+ my $base = 0;
2034
2035
 
2035
2036
  # verify this is a valid RIFF file
2036
2037
  return 0 unless $raf->Read($buff, 12) == 12;
@@ -2042,7 +2043,8 @@ sub ProcessRIFF($$)
2042
2043
  return 0 unless $buff =~ /^(LA0[234]|OFR |LPAC|wvpk)/ and $raf->Read($buf2, 1024);
2043
2044
  $type = $riffType{$1};
2044
2045
  $buff .= $buf2;
2045
- return 0 unless $buff =~ /WAVE(.{4})?fmt /sg and $raf->Seek(pos($buff) - 4, 0);
2046
+ return 0 unless $buff =~ /WAVE(.{4})?(junk|fmt )/sg and $raf->Seek(pos($buff) - 4, 0);
2047
+ $base = pos($buff) - 16;
2046
2048
  }
2047
2049
  $$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode
2048
2050
  $mime = $riffMimeType{$type} if $type;
@@ -2159,7 +2161,7 @@ sub ProcessRIFF($$)
2159
2161
  DataPos => 0, # (relative to Base)
2160
2162
  Start => 0,
2161
2163
  Size => $len,
2162
- Base => $pos,
2164
+ Base => $pos + $base,
2163
2165
  );
2164
2166
  if ($setGroups) {
2165
2167
  delete $$et{SET_GROUP0};
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.75';
37
+ $VERSION = '3.76';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -2193,6 +2193,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2193
2193
  399 => 'ZV-E10M2', #JR
2194
2194
  400 => 'ILCE-1M2', #PH
2195
2195
  401 => 'DSC-RX1RM3', #JR
2196
+ 402 => 'ILCE-6400A', #github347
2197
+ 404 => 'DSC-RX100M7A', #github347
2196
2198
  406 => 'ILME-FX2', #JR
2197
2199
  },
2198
2200
  },
@@ -751,8 +751,8 @@ my %tagLookup = (
751
751
  'afconfidence' => { 1 => 0x3d },
752
752
  'afconfigtool' => { 2 => 0x1 },
753
753
  'afcoordinatesavailable' => { 203 => 0x7, 204 => 0x7 },
754
- 'afcpointtracking' => { 371 => '545.2' },
755
- 'afcsensitivity' => { 371 => '545.1' },
754
+ 'afcpointtracking' => { 371 => '545.1' },
755
+ 'afcsensitivity' => { 371 => '545.2' },
756
756
  'afdefocus' => { 371 => 0x6 },
757
757
  'afdetectionmethod' => { 200 => 0x4, 201 => 0x4, 203 => 0x4, 204 => 0x4 },
758
758
  'afduringliveview' => { 90 => 0x511 },
@@ -1968,7 +1968,10 @@ my %tagLookup = (
1968
1968
  'composerkeywords' => { 425 => "\xa9cok" },
1969
1969
  'compositeimage' => { 125 => 0xa460, 539 => 'CompositeImage' },
1970
1970
  'compositeimagecount' => { 125 => 0xa461, 539 => 'CompositeImageCount' },
1971
+ 'compositeimagecount1' => { 133 => 0x1151 },
1972
+ 'compositeimagecount2' => { 133 => 0x1152 },
1971
1973
  'compositeimageexposuretimes' => { 125 => 0xa462, 539 => 'CompositeImageExposureTimes' },
1974
+ 'compositeimagemode' => { 133 => 0x1150 },
1972
1975
  'composition' => { 520 => 'Composition' },
1973
1976
  'compositionadjust' => { 397 => '0.1' },
1974
1977
  'compositionadjustrotation' => { 397 => 0x7 },
@@ -5098,6 +5101,7 @@ my %tagLookup = (
5098
5101
  'multiframenoisereduction' => { 455 => 0x35, 467 => 0x200b, 472 => 0x15 },
5099
5102
  'multiframenreffect' => { 467 => 0x2023 },
5100
5103
  'multifunctionlock' => { 90 => 0x70f },
5104
+ 'multipleexposure' => { 133 => 0x1037 },
5101
5105
  'multipleexposuremode' => { 250 => 0x1bc, 252 => 0x98, 255 => 0x8c, 256 => 0x9a, 257 => 0x9a, 339 => 0x101c },
5102
5106
  'multipleexposureset' => { 378 => '10.1' },
5103
5107
  'multisample' => { 272 => 0x40 },
@@ -7675,7 +7679,7 @@ my %tagLookup = (
7675
7679
  'whitebalancebias' => { 119 => 0x2011, 340 => 0x304, 360 => 0x23 },
7676
7680
  'whitebalanceblue' => { 79 => 0x7 },
7677
7681
  'whitebalancebracket' => { 335 => 0x502, 340 => 0x303 },
7678
- 'whitebalancebracketing' => { 191 => 0x22, 194 => 0x2c, 464 => 0x2c },
7682
+ 'whitebalancebracketing' => { 133 => 0x1102, 191 => 0x22, 194 => 0x2c, 464 => 0x2c },
7679
7683
  'whitebalancebuttonplaybackmode' => { 331 => 0x1c5, 332 => 0x1dd },
7680
7684
  'whitebalancecomp' => { 343 => 0x1001 },
7681
7685
  'whitebalancedetected' => { 145 => 0x3fb },
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 28636 tags, with 17834 unique tag names.
15
+ They contain a total of 28650 tags, with 17839 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -11539,8 +11539,8 @@ file name combined with the hierarchical protobuf field numbers.
11539
11539
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
11540
11540
  which use the following protocols: dvtm_AVATA2.proto (Avata 2),
11541
11541
  dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
11542
- dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
11543
- dvtm_pm320.proto (Mini 4 Pro).
11542
+ dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30),
11543
+ dvtm_Mini4_Pro.proto (Mini 4 Pro) and dvtm_dji_neo.proto (DJI Neo).
11544
11544
 
11545
11545
  Note that with the protobuf format, numerical tags missing from the output
11546
11546
  for a given protocol should be considered to have the default value of 0.
@@ -11596,6 +11596,18 @@ for a given protocol should be considered to have the default value of 0.
11596
11596
  'dvtm_ac204_3-4-2-1' GPSInfo DJI GPSInfo
11597
11597
  'dvtm_ac204_3-4-2-2' GPSAltitude no
11598
11598
  'dvtm_ac204_3-4-2-6-1' GPSDateTime no
11599
+ 'dvtm_dji_neo_1-1-5' SerialNumber no
11600
+ 'dvtm_dji_neo_1-1-10' Model no
11601
+ 'dvtm_dji_neo_2-2-3-1' SerialNumber2 no
11602
+ 'dvtm_dji_neo_2-3' FrameInfo DJI FrameInfo
11603
+ 'dvtm_dji_neo_3-1-2' TimeStamp no
11604
+ 'dvtm_dji_neo_3-2-2-1' ISO no
11605
+ 'dvtm_dji_neo_3-2-4-1' ShutterSpeed no
11606
+ 'dvtm_dji_neo_3-2-6-1' ColorTemperature no
11607
+ 'dvtm_dji_neo_3-2-10-1' FNumber no
11608
+ 'dvtm_dji_neo_3-4-3' DroneInfo DJI DroneInfo
11609
+ 'dvtm_dji_neo_3-4-4-1' GPSInfo DJI GPSInfo
11610
+ 'dvtm_dji_neo_3-4-4-2' AbsoluteAltitude no
11599
11611
  'dvtm_pm320_1-1-5' SerialNumber no
11600
11612
  'dvtm_pm320_1-1-10' Model no
11601
11613
  'dvtm_pm320_2-2' FrameInfo DJI FrameInfo
@@ -12142,6 +12154,7 @@ Tags extracted from FLIR Public image Format (FPF) files.
12142
12154
  0x1032 ExposureCount int16u
12143
12155
  0x1033 EXRAuto int16u
12144
12156
  0x1034 EXRMode int16u
12157
+ 0x1037 MultipleExposure int16u
12145
12158
  0x1040 ShadowTone int32s
12146
12159
  0x1041 HighlightTone int32s
12147
12160
  0x1044 DigitalZoom int32u
@@ -12159,9 +12172,13 @@ Tags extracted from FLIR Public image Format (FPF) files.
12159
12172
  0x1053 CropSize int32u
12160
12173
  0x1100 AutoBracketing int16u
12161
12174
  0x1101 SequenceNumber int16u
12175
+ 0x1102 WhiteBalanceBracketing int16u
12162
12176
  0x1103 DriveSettings FujiFilm DriveSettings
12163
12177
  0x1105 PixelShiftShots int16u
12164
12178
  0x1106 PixelShiftOffset rational64s[2]
12179
+ 0x1150 CompositeImageMode int32u
12180
+ 0x1151 CompositeImageCount1 int16u
12181
+ 0x1152 CompositeImageCount2 int16u
12165
12182
  0x1153 PanoramaAngle int16u
12166
12183
  0x1154 PanoramaDirection int16u
12167
12184
  0x1201 AdvancedFilter int32u
@@ -12353,14 +12370,15 @@ Tags found in the FujiIFD information of RAF images from some models.
12353
12370
  =head3 FujiFilm MRAW Tags
12354
12371
 
12355
12372
  Tags extracted from the M-RAW header of multi-image RAF files. The family 1
12356
- group name for these tags is "M-RAW".
12373
+ group name for these tags is "M-RAW". Additional metadata may be extracted
12374
+ from the embedded RAW images with the ExtractEmbedded option.
12357
12375
 
12358
12376
  Tag ID Tag Name Writable
12359
12377
  ------ -------- --------
12360
- 0x0001 RawImageNumber no
12361
- 0x0005 ExposureTime no
12362
- 0x0006 FNumber no
12363
- 0x0007 ISO no
12378
+ 0x2001 RawImageNumber no
12379
+ 0x2005 ExposureTime no
12380
+ 0x2006 FNumber no
12381
+ 0x2007 ISO no
12364
12382
 
12365
12383
  =head3 FujiFilm FFMV Tags
12366
12384
 
@@ -20734,8 +20752,8 @@ Flash information tags for the K10D, K20D and K200D.
20734
20752
  543 FirstFrameActionInAFC int8u
20735
20753
  544 ActionInAFCCont int8u
20736
20754
  545 AFCHold int8u & 0x03
20737
- 545.1 AFCSensitivity int8u & 0x0c
20738
- 545.2 AFCPointTracking int8u & 0x70
20755
+ 545.1 AFCPointTracking int8u & 0x0c
20756
+ 545.2 AFCSensitivity int8u & 0x70
20739
20757
  2400 SubjectRecognition int8u
20740
20758
 
20741
20759
  =head3 Pentax KelvinWB Tags
@@ -30526,7 +30544,7 @@ for the official QuickTime specification.
30526
30544
  The tags below are extracted from timed metadata in QuickTime and other
30527
30545
  formats of video files when the ExtractEmbedded option is used. Although
30528
30546
  most of these tags are combined into the single table below, ExifTool
30529
- currently reads 110 different types of timed GPS metadata from video files.
30547
+ currently reads 111 different types of timed GPS metadata from video files.
30530
30548
 
30531
30549
  Tag ID Tag Name Writable
30532
30550
  ------ -------- --------
@@ -1352,7 +1352,8 @@ sub SetNewValuesFromFile($$;@)
1352
1352
  # get all tags from source file (including MakerNotes block)
1353
1353
  $info = $srcExifTool->ImageInfo($srcFile);
1354
1354
  }
1355
- return $info if $$info{Error} and $$info{Error} eq 'Error opening file';
1355
+ # (allow processing to continue if we have alternate files that may have been read OK)
1356
+ return $info if $$info{Error} and $$info{Error} eq 'Error opening file' and not $$self{ALT_EXIFTOOL};
1356
1357
  delete $$srcExifTool{VALUE}{Error}; # delete so we can check this later
1357
1358
 
1358
1359
  # sort tags in file order with priority tags last
@@ -3350,13 +3350,14 @@ sub PrintLensID(@)
3350
3350
  #------------------------------------------------------------------------------
3351
3351
  # Convert XMP date/time to EXIF format
3352
3352
  # Inputs: 0) XMP date/time string, 1) set if we aren't sure this is a date
3353
- # Returns: EXIF date/time
3353
+ # Returns: EXIF date/time, and flag in list context if this was a standard date/time value
3354
3354
  sub ConvertXMPDate($;$)
3355
3355
  {
3356
3356
  my ($val, $unsure) = @_;
3357
3357
  if ($val =~ /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}:\d{2})(:\d{2})?\s*(\S*)$/) {
3358
3358
  my $s = $5 || ''; # seconds may be missing
3359
3359
  $val = "$1:$2:$3 $4$s$6"; # convert back to EXIF time format
3360
+ return($val, 1) if wantarray;
3360
3361
  } elsif (not $unsure and $val =~ /^(\d{4})(-\d{2}){0,2}/) {
3361
3362
  $val =~ tr/-/:/;
3362
3363
  }
@@ -3647,7 +3648,12 @@ NoLoop:
3647
3648
  if (($new or $fmt eq 'rational') and ConvertRational($val)) {
3648
3649
  $rational = $rawVal;
3649
3650
  } else {
3650
- $val = ConvertXMPDate($val, $new) if $new or $fmt eq 'date';
3651
+ my $stdDate;
3652
+ ($val, $stdDate) = ConvertXMPDate($val, $new) if $new or $fmt eq 'date';
3653
+ if ($stdDate and $added) {
3654
+ $$tagInfo{Groups}{2} = 'Time';
3655
+ $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
3656
+ }
3651
3657
  }
3652
3658
  if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean' and $val!~/^True|False$/) {
3653
3659
  if ($val =~ /^true|false$/) {
@@ -1934,7 +1934,7 @@ my %sACDSeeRegionStruct = (
1934
1934
  BurstPrimary => { },
1935
1935
  PortraitNote => { },
1936
1936
  PortraitRequest => {
1937
- Notes => 'High Definition Render Pipeline (HDRP) data', #PH (guess)
1937
+ Notes => 'HDRPlus (HDRP) data', #NealKrawetz
1938
1938
  ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
1939
1939
  ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
1940
1940
  },
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars $advFmtSelf $configFile @configFiles $noConfig);
31
31
 
32
- $VERSION = '13.34';
32
+ $VERSION = '13.36';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -2825,6 +2825,8 @@ sub ExtractInfo($;@)
2825
2825
  $isDir = 1;
2826
2826
  } else {
2827
2827
  $self->Error('Error opening file');
2828
+ # continue to process alt files if necessary
2829
+ $self->DoneExtract() if $$self{ALT_EXIFTOOL};
2828
2830
  }
2829
2831
  } else {
2830
2832
  $self->Error('No file specified');
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 13.34
3
+ Version: 13.36
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('13.34.0')
4
+ VERSION = Gem::Version.new('13.36.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.34.0
4
+ version: 13.36.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-09-03 00:00:00.000000000 Z
12
+ date: 2025-09-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool