exiftool-vendored.pl 12.44.0 → 12.45.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.
Files changed (35) hide show
  1. package/bin/Changes +28 -0
  2. package/bin/META.json +1 -1
  3. package/bin/META.yml +1 -1
  4. package/bin/README +2 -2
  5. package/bin/exiftool +25 -21
  6. package/bin/fmt_files/gpx.fmt +3 -0
  7. package/bin/fmt_files/gpx_wpt.fmt +3 -0
  8. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -4
  9. package/bin/lib/Image/ExifTool/Canon.pm +17 -11
  10. package/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  11. package/bin/lib/Image/ExifTool/EXE.pm +9 -1
  12. package/bin/lib/Image/ExifTool/Exif.pm +5 -5
  13. package/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  14. package/bin/lib/Image/ExifTool/GPS.pm +2 -2
  15. package/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -1
  16. package/bin/lib/Image/ExifTool/ID3.pm +1 -1
  17. package/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  18. package/bin/lib/Image/ExifTool/Nikon.pm +6 -1
  19. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +18 -5
  20. package/bin/lib/Image/ExifTool/QuickTime.pm +80 -4
  21. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +2 -2
  22. package/bin/lib/Image/ExifTool/Sony.pm +2 -1
  23. package/bin/lib/Image/ExifTool/TagLookup.pm +12 -1
  24. package/bin/lib/Image/ExifTool/TagNames.pod +36 -13
  25. package/bin/lib/Image/ExifTool/Validate.pm +3 -3
  26. package/bin/lib/Image/ExifTool/WriteExif.pl +81 -22
  27. package/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  28. package/bin/lib/Image/ExifTool/Writer.pl +5 -2
  29. package/bin/lib/Image/ExifTool/XMP.pm +7 -3
  30. package/bin/lib/Image/ExifTool/XMP2.pl +11 -4
  31. package/bin/lib/Image/ExifTool.pm +1 -1
  32. package/bin/lib/Image/ExifTool.pod +6 -5
  33. package/bin/perl-Image-ExifTool.spec +1 -1
  34. package/bin/pp_build_exe.args +4 -4
  35. package/package.json +1 -1
package/bin/Changes CHANGED
@@ -7,6 +7,34 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.42. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Sept. 16, 2022 - Version 12.45
11
+
12
+ - Added new IPTC Video Metadata version 1.3 tags
13
+ - Added a couple of new Canon lenses (thanks Norbert Wasser)
14
+ - Added a new Sony LensType (thanks Jos Roost)
15
+ - Added known Unknown value for IPTC ChromaticityColorant (thanks Herb)
16
+ - Added new Nikon WhiteBalanceFineTune tag (thanks Milos Komarcevic)
17
+ - Extract the raw thermal data from all frames of a SEQ file when -ee2 is used
18
+ - Decode individual tags in QuickTime ColorRepresentation
19
+ - Decode a new Matroska tag
20
+ - Improved verbose "nothing changed" messages when writing
21
+ - Patched -ee option to extract metadata after the first Cluster in MKV videos
22
+ (previously only -U and -v did this)
23
+ - Patched to differentiate Java bytecode .class files from Mach-O fat binaries
24
+ - Patched to avoid "Use of uninitialized value" warning when deleting GPS
25
+ coordinates via the newly writable Composite tags
26
+ - Patched to avoid duplicating raw data when writing Sony ARW images where the
27
+ raw data is double-referenced as both strips and tiles (affects ARW images
28
+ from some newer models like the ILCE-1 when SonyRawFileType is "Lossless
29
+ Compressed RAW 2")
30
+ - Patched to avoid "fixing" the order of IFD entries in TIFF-based RAW files
31
+ to improve compatibility with some RAW viewers
32
+ - Minor change to Composite FileNumber to remove "-" when -n is used
33
+ - Fixed problem extracting some timed metadata when "-api ignoretags=all" was
34
+ used with "-api requesttags" to request the specific information
35
+ - Fixed -validate feature to avoid incorrectly warning about non-capitalized
36
+ boolean values in XMP
37
+
10
38
  July 21, 2022 - Version 12.44
11
39
 
12
40
  - Added a few new Sony lenses (thanks Jos Roost)
package/bin/META.json CHANGED
@@ -47,6 +47,6 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.44",
50
+ "version" : "12.45",
51
51
  "x_serialization_backend" : "JSON::PP version 4.02"
52
52
  }
package/bin/META.yml CHANGED
@@ -28,5 +28,5 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.44
31
+ version: 12.45
32
32
  x_serialization_backend: 'JSON::PP version 4.02'
package/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.44.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.44
110
+ gzip -dc Image-ExifTool-12.45.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.45
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
package/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.44';
14
+ my $version = '12.45';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -2307,7 +2307,7 @@ TAG: foreach $tag (@foundTags) {
2307
2307
  if (ref $val) {
2308
2308
  # happens with -X, -j or -php when combined with -b:
2309
2309
  if (defined $binaryOutput and not $binaryOutput and $$et{TAG_INFO}{$tag}{Protected}) {
2310
- # avoid extracting Protected binary tags (eg. data blocks) [insider information]
2310
+ # avoid extracting Unsafe binary tags (eg. data blocks) [insider information]
2311
2311
  my $lcTag = lc $tag;
2312
2312
  $lcTag =~ s/ .*//;
2313
2313
  next unless $$et{REQ_TAG_LOOKUP}{$lcTag} or ($$et{OPTIONS}{RequestAll} || 0) > 2;
@@ -4990,16 +4990,17 @@ B<-struct> option for details.
4990
4990
  8) With the redirection feature, copying a tag directly (ie.
4991
4991
  E<quot>'-I<DSTTAG>E<lt>I<SRCTAG>'E<quot>) is not the same as interpolating
4992
4992
  its value inside a string (ie. E<quot>'-I<DSTTAG>E<lt>$I<SRCTAG>'E<quot>)
4993
- for list-type tags, L<shortcut tags|Image::ExifTool::Shortcuts>, tag names
4994
- containing wildcards, or UserParam variables. When copying directly, the
4995
- values of each matching source tag are copied individually to the
4996
- destination tag (as if they were separate assignments). However, when
4997
- interpolated inside a string, list items and the values of shortcut tags are
4998
- concatenated (with a separator set by the B<-sep> option), and wildcards are
4999
- not allowed. Also, UserParam variables are available only when interpolated
5000
- in a string. Another difference is that a minor warning is generated if a
5001
- tag doesn't exist when interpolating its value in a string (with C<$>), but
5002
- isn't when copying the tag directly.
4993
+ for source tags which are list-type tags,
4994
+ L<shortcut tags|Image::ExifTool::Shortcuts>, tag names containing wildcards,
4995
+ or UserParam variables. When copying directly, the values of each matching
4996
+ source tag are copied individually to the destination tag (as if they were
4997
+ separate assignments). However, when interpolated inside a string, list
4998
+ items and the values of shortcut tags are concatenated (with a separator set
4999
+ by the B<-sep> option), and wildcards are not allowed. Also, UserParam
5000
+ variables are available only when interpolated in a string. Another
5001
+ difference is that a minor warning is generated if a tag doesn't exist when
5002
+ interpolating its value in a string (with C<$>), but isn't when copying the
5003
+ tag directly.
5003
5004
 
5004
5005
  Finally, the behaviour is different when a destination tag or group of
5005
5006
  C<All> is used. When copying directly, a destination group and/or tag name
@@ -5317,7 +5318,9 @@ ASCII "base64:" as the first 7 bytes of the value), and B<-t> may be added
5317
5318
  to include tag table information (see B<-t> for details). The JSON output
5318
5319
  is UTF-8 regardless of any B<-L> or B<-charset> option setting, but the
5319
5320
  UTF-8 validation is disabled if a character set other than UTF-8 is
5320
- specified.
5321
+ specified. Note that ExifTool quotes JSON values only if they don't look
5322
+ like numbers (regardless of the original storage format or the relevant
5323
+ metadata specification).
5321
5324
 
5322
5325
  If I<JSONFILE> is specified, the file is imported and the tag definitions
5323
5326
  from the file are used to set tag values on a per-file basis. The special
@@ -5361,7 +5364,7 @@ been implemented. May also be combined with B<-listx> to output
5361
5364
  descriptions in one language only.
5362
5365
 
5363
5366
  By default, ExifTool uses UTF-8 encoding for special characters, but the
5364
- the B<-L> or B<-charset> option may be used to invoke other encodings. Note
5367
+ B<-L> or B<-charset> option may be used to invoke other encodings. Note
5365
5368
  that ExifTool uses Unicode::LineBreak if available to help preserve the
5366
5369
  column alignment of the plain text output for languages with a
5367
5370
  variable-width character set.
@@ -5467,7 +5470,7 @@ with this command:
5467
5470
 
5468
5471
  produces output like this:
5469
5472
 
5470
- -- Generated by ExifTool 12.44 --
5473
+ -- Generated by ExifTool 12.45 --
5471
5474
  File: a.jpg - 2003:10:31 15:44:19
5472
5475
  (f/5.6, 1/60s, ISO 100)
5473
5476
  File: b.jpg - 2006:05:23 11:57:38
@@ -5475,8 +5478,8 @@ produces output like this:
5475
5478
  -- end --
5476
5479
 
5477
5480
  The values of List-type tags with multiple items and Shortcut tags
5478
- representing multiple tags are joined according the the B<-sep> option
5479
- setting when interpolated in the string.
5481
+ representing multiple tags are joined according the B<-sep> option setting
5482
+ when interpolated in the string.
5480
5483
 
5481
5484
  When B<-ee> (B<-extractEmbedded>) is combined with B<-p>, embedded documents
5482
5485
  are effectively processed as separate input files.
@@ -5978,10 +5981,11 @@ also specified on the command line. The alternative is to use the
5978
5981
  C<$GROUP:all> syntax. (eg. Use C<$exif:all> instead of C<$exif> in I<EXPR>
5979
5982
  to test for the existence of EXIF tags.)
5980
5983
 
5981
- 3) Tags in the string are interpolated the same way as with B<-p> before the
5984
+ 3) Tags in the string are interpolated in a similar way to B<-p> before the
5982
5985
  expression is evaluated. In this interpolation, C<$/> is converted to a
5983
- newline and C<$$> represents a single C<$> symbol (so Perl variables, if
5984
- used, require a double C<$>).
5986
+ newline and C<$$> represents a single C<$> symbol. So Perl variables, if
5987
+ used, require a double C<$>, and regular expressions ending in C<$/> must
5988
+ use C<$$/> instead.
5985
5989
 
5986
5990
  4) The condition may only test tags from the file being processed. To
5987
5991
  process one file based on tags from another, two steps are required. For
@@ -7228,7 +7232,7 @@ Combine multiple track logs and geotag an entire directory tree of images.
7228
7232
 
7229
7233
  Read all track logs from the C<tracks> directory.
7230
7234
 
7231
- =item exiftool -p gpx.fmt -d %Y-%m-%dT%H:%M:%SZ dir > out.gpx
7235
+ =item exiftool -p gpx.fmt dir > out.gpx
7232
7236
 
7233
7237
  Generate a GPX track log from all images in directory C<dir>. This example
7234
7238
  uses the C<gpx.fmt> file included in the full ExifTool distribution package
@@ -16,6 +16,9 @@
16
16
  # 2) The -ee3 option is to extract the full track from video files.
17
17
  # 3) The -fileOrder option may be used to control the order of the
18
18
  # generated track points when processing multiple files.
19
+ # 4) Coordinates are written at full resolution. To change this,
20
+ # remove the "#" from the GPSLatitude/Longitude tag names below
21
+ # and use the -c option to set the desired precision.
19
22
  #------------------------------------------------------------------------------
20
23
  #[HEAD]<?xml version="1.0" encoding="utf-8"?>
21
24
  #[HEAD]<gpx version="1.0"
@@ -17,6 +17,9 @@
17
17
  # 2) The -ee3 option is to extract the full track from video files.
18
18
  # 3) The -fileOrder option may be used to control the order of the
19
19
  # generated track points when processing multiple files.
20
+ # 4) Coordinates are written at full resolution. To change this,
21
+ # remove the "#" from the GPSLatitude/Longitude tag names below
22
+ # and use the -c option to set the desired precision.
20
23
  #------------------------------------------------------------------------------
21
24
  #[HEAD]<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
22
25
  #[HEAD]<gpx version="1.1"
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
35
35
  use Image::ExifTool::Validate;
36
36
  use Image::ExifTool::MacOS;
37
37
 
38
- $VERSION = '3.47';
38
+ $VERSION = '3.48';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -1324,9 +1324,12 @@ TagID: foreach $tagID (@keys) {
1324
1324
  if ($writable) {
1325
1325
  foreach ('PrintConv','ValueConv') {
1326
1326
  next unless $$tagInfo{$_};
1327
- next if $$tagInfo{$_ . 'Inv'};
1328
- next if ref($$tagInfo{$_}) =~ /^(HASH|ARRAY)$/;
1329
- next if $$tagInfo{WriteAlso};
1327
+ next if defined $$tagInfo{$_ . 'Inv'};
1328
+ # (undefined inverse conversion overrides hash lookup)
1329
+ unless (exists $$tagInfo{$_ . 'Inv'}) {
1330
+ next if ref($$tagInfo{$_}) =~ /^(HASH|ARRAY)$/;
1331
+ next if $$tagInfo{WriteAlso};
1332
+ }
1330
1333
  if ($_ eq 'ValueConv') {
1331
1334
  undef $writable;
1332
1335
  } else {
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.59';
91
+ $VERSION = '4.60';
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)
@@ -605,15 +605,17 @@ $VERSION = '4.59';
605
605
  '61182.27' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
606
606
  '61182.28' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
607
607
  '61182.29' => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
608
- '61182.30' => 'Canon RF 16mm F2.8 STM', #42
609
- '61182.31' => 'Canon RF 400mm F2.8L IS USM', #IB
610
- '61182.32' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
611
- '61182.33' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
612
- '61182.34' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
613
- # we need the RFLensType values for the following...
614
- '61182.35' => 'Canon RF 800mm F5.6L IS USM', #PH (NC)
615
- '61182.36' => 'Canon RF 1200mm F8L IS USM', #PH (NC)
616
- '61182.37' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
608
+ '61182.30' => 'Canon RF 24mm F1.8 MACRO IS STM', #42
609
+ '61182.31' => 'Canon RF 16mm F2.8 STM', #42
610
+ '61182.32' => 'Canon RF 400mm F2.8L IS USM', #IB
611
+ '61182.33' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
612
+ '61182.34' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
613
+ '61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
614
+ '61182.36' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
615
+ # we need the RFLensType values for the following...
616
+ '61182.37' => 'Canon RF 800mm F5.6L IS USM', #PH (NC)
617
+ '61182.38' => 'Canon RF 1200mm F8L IS USM', #PH (NC)
618
+ '61182.39' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
617
619
  65535 => 'n/a',
618
620
  );
619
621
 
@@ -6815,11 +6817,13 @@ my %ciMaxFocal = (
6815
6817
  284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
6816
6818
  285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
6817
6819
  286 => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
6820
+ 287 => 'Canon RF 24mm F1.8 MACRO IS STM', #42
6818
6821
  288 => 'Canon RF 16mm F2.8 STM', #42
6819
6822
  289 => 'Canon RF 400mm F2.8L IS USM', #IB
6820
6823
  290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
6821
6824
  291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
6822
6825
  292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
6826
+ 302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
6823
6827
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6824
6828
  },
6825
6829
  },
@@ -6864,6 +6868,7 @@ my %ciMaxFocal = (
6864
6868
  8 => '4:5',
6865
6869
  12 => '3:2 (APS-H crop)', #IB
6866
6870
  13 => '3:2 (APS-C crop)', #IB
6871
+ 258 => '4:3 crop', #PH (NC)
6867
6872
  },
6868
6873
  },
6869
6874
  # (could use better names for these, or the Crop tags above, or both)
@@ -9393,8 +9398,9 @@ my %filterConv = (
9393
9398
  # numbers from the previous image, so we need special logic
9394
9399
  # to handle the FileIndex wrap properly)
9395
9400
  $val[1] == 10000 and $val[1] = 1, ++$val[0];
9396
- return sprintf("%.3d-%.4d",@val);
9401
+ return sprintf("%.3d%.4d",@val);
9397
9402
  },
9403
+ PrintConv => '$_=$val;s/(\d+)(\d{4})/$1-$2/;$_',
9398
9404
  },
9399
9405
  );
9400
9406
 
@@ -23,7 +23,7 @@ use vars qw($VERSION);
23
23
  use Image::ExifTool qw(:DataAccess :Utils);
24
24
  use Image::ExifTool::Canon;
25
25
 
26
- $VERSION = '1.33';
26
+ $VERSION = '1.34';
27
27
 
28
28
  sub ProcessCanonVRD($$;$);
29
29
  sub WriteCanonVRD($$;$);
@@ -2046,17 +2046,16 @@ sub ProcessCanonVRD($$;$)
2046
2046
  return 0;
2047
2047
  }
2048
2048
  }
2049
- # exit quickly if writing and no CanonVRD tags are being edited
2050
- if ($outfile and not exists $$et{EDIT_DIRS}{CanonVRD}) {
2051
- print $out "$$et{INDENT} [nothing changed]\n" if $verbose;
2052
- return 1 if $outfile eq $dataPt;
2053
- return Write($outfile, $$dataPt) ? 1 : -1;
2054
- }
2055
-
2056
2049
  my $vrdType = 'VRD';
2057
2050
 
2058
2051
  if ($outfile) {
2059
2052
  $verbose and not $created and print $out " Rewriting CanonVRD trailer\n";
2053
+ # exit quickly if writing and no CanonVRD tags are being edited
2054
+ unless (exists $$et{EDIT_DIRS}{CanonVRD}) {
2055
+ print $out "$$et{INDENT} [nothing changed in CanonVRD]\n" if $verbose;
2056
+ return 1 if $outfile eq $dataPt;
2057
+ return Write($outfile, $$dataPt) ? 1 : -1;
2058
+ }
2060
2059
  # delete CanonVRD information if specified
2061
2060
  my $doDel = $$et{DEL_GROUP}{CanonVRD};
2062
2061
  unless ($doDel) {
@@ -21,7 +21,7 @@ use strict;
21
21
  use vars qw($VERSION);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
 
24
- $VERSION = '1.17';
24
+ $VERSION = '1.18';
25
25
 
26
26
  sub ProcessPEResources($$);
27
27
  sub ProcessPEVersion($$);
@@ -1233,6 +1233,14 @@ sub ProcessEXE($$)
1233
1233
  $tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO');
1234
1234
  if ($1 eq "\xca\xfe\xba\xbe") {
1235
1235
  SetByteOrder('MM');
1236
+ my $ver = Get32u(\$buff, 4);
1237
+ # Java bytecode .class files have the same magic number, so we need to look deeper
1238
+ # (ref https://github.com/file/file/blob/master/magic/Magdir/cafebabe#L6-L15)
1239
+ if ($ver > 30) {
1240
+ # this is Java bytecode
1241
+ $et->SetFileType('Java bytecode', 'application/java-byte-code', 'class');
1242
+ return 1;
1243
+ }
1236
1244
  $et->SetFileType('Mach-O fat binary executable', undef, '');
1237
1245
  return 1 if $fast3;
1238
1246
  my $count = Get32u(\$buff, 4); # get architecture count
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
56
56
  use Image::ExifTool qw(:DataAccess :Utils);
57
57
  use Image::ExifTool::MakerNotes;
58
58
 
59
- $VERSION = '4.40';
59
+ $VERSION = '4.41';
60
60
 
61
61
  sub ProcessExif($$$);
62
62
  sub WriteExif($$$);
@@ -4842,10 +4842,10 @@ my %subSecConv = (
4842
4842
  Writable => 1,
4843
4843
  Protected => 1,
4844
4844
  WriteAlso => {
4845
- GPSLatitude => '$val =~ /(.*?)( ?[NS])?,/ ? $1 : undef',
4846
- GPSLatitudeRef => '$val =~ /(-?)(.*?) ?([NS]?),/ ? ($3 || ($1 ? "S" : "N")) : undef',
4847
- GPSLongitude => '$val =~ /, ?(.*?)( ?[EW]?)$/ ? $1 : undef',
4848
- GPSLongitudeRef => '$val =~ /, ?(-?)(.*?) ?([EW]?)$/ ? ($3 || ($1 ? "W" : "E")) : undef',
4845
+ GPSLatitude => '(defined $val and $val =~ /(.*?)( ?[NS])?,/) ? $1 : undef',
4846
+ GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?) ?([NS]?),/) ? ($3 || ($1 ? "S" : "N")) : undef',
4847
+ GPSLongitude => '(defined $val and $val =~ /, ?(.*?)( ?[EW]?)$/) ? $1 : undef',
4848
+ GPSLongitudeRef => '(defined $val and $val =~ /, ?(-?)(.*?) ?([EW]?)$/) ? ($3 || ($1 ? "W" : "E")) : undef',
4849
4849
  },
4850
4850
  PrintConvInv => q{
4851
4851
  return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
@@ -24,7 +24,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
24
24
  use Image::ExifTool::Exif;
25
25
  use Image::ExifTool::GPS;
26
26
 
27
- $VERSION = '1.20';
27
+ $VERSION = '1.21';
28
28
 
29
29
  sub ProcessFLIR($$;$);
30
30
  sub ProcessFLIRText($$$);
@@ -99,7 +99,8 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
99
99
  NOTES => q{
100
100
  Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
101
101
  images. These tags may also be extracted from the first frame of an FLIR
102
- SEQ file, or all frames if the ExtractEmbedded option is used.
102
+ SEQ file, or all frames if the ExtractEmbedded option is used. Setting
103
+ ExtractEmbedded to 2 also the raw thermal data from all frames.
103
104
  },
104
105
  "_header" => {
105
106
  Name => 'FFFHeader',
@@ -1551,7 +1552,7 @@ sub ProcessFLIR($$;$)
1551
1552
  $$et{INDENT}, $i, $recType, $recPos, $recLen;
1552
1553
 
1553
1554
  # skip RawData records for embedded documents
1554
- if ($recType == 1 and $$et{DOC_NUM}) {
1555
+ if ($recType == 1 and $$et{DOC_NUM} and $et->Options('ExtractEmbedded') < 2) {
1555
1556
  $raf->Seek($base+$recPos+$recLen) or $success = 0, last;
1556
1557
  next;
1557
1558
  }
@@ -369,7 +369,7 @@ my %coordConv = (
369
369
  },
370
370
  WriteAlso => {
371
371
  'GPS:GPSLatitude' => '$val',
372
- 'GPS:GPSLatitudeRef' => '$val < 0 ? "S" : "N"',
372
+ 'GPS:GPSLatitudeRef' => '(defined $val and $val < 0) ? "S" : "N"',
373
373
  },
374
374
  ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]',
375
375
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
@@ -386,7 +386,7 @@ my %coordConv = (
386
386
  },
387
387
  WriteAlso => {
388
388
  'GPS:GPSLongitude' => '$val',
389
- 'GPS:GPSLongitudeRef' => '$val < 0 ? "W" : "E"',
389
+ 'GPS:GPSLongitudeRef' => '(defined $val and $val < 0) ? "W" : "E"',
390
390
  },
391
391
  Require => {
392
392
  0 => 'GPS:GPSLongitude',
@@ -25,7 +25,7 @@ use strict;
25
25
  use vars qw($VERSION);
26
26
  use Image::ExifTool qw(:DataAccess :Utils);
27
27
 
28
- $VERSION = '1.39';
28
+ $VERSION = '1.40';
29
29
 
30
30
  sub ProcessICC($$);
31
31
  sub ProcessICC_Profile($$$);
@@ -815,6 +815,7 @@ my %manuSig = ( #6
815
815
  Name => 'ChromaticityColorant',
816
816
  Format => 'int16u',
817
817
  PrintConv => {
818
+ 0 => 'Unknown',
818
819
  1 => 'ITU-R BT.709',
819
820
  2 => 'SMPTE RP145-1994',
820
821
  3 => 'EBU Tech.3213-E',
@@ -1516,7 +1516,7 @@ sub ProcessID3($$)
1516
1516
  }
1517
1517
  }
1518
1518
  #
1519
- # process the the information
1519
+ # process the information
1520
1520
  #
1521
1521
  if ($rtnVal) {
1522
1522
  # first process audio data if it exists
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.11';
17
+ $VERSION = '1.12';
18
18
 
19
19
  my %noYes = ( 0 => 'No', 1 => 'Yes' );
20
20
 
@@ -27,8 +27,10 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
27
27
  NOTES => q{
28
28
  The following tags are extracted from Matroska multimedia container files.
29
29
  This container format is used by file types such as MKA, MKV, MKS and WEBM.
30
- For speed, ExifTool extracts tags only up to the first Cluster unless the
31
- L<Verbose|../ExifTool.html#Verbose> (-v) or L<Unknown|../ExifTool.html#Unknown> = 2 (-U) option is used. See
30
+ For speed, by default ExifTool extracts tags only up to the first Cluster.
31
+ However, the L<Verbose|../ExifTool.html#Verbose> (-v) and L<Unknown|../ExifTool.html#Unknown> = 2 (-U) options force processing of
32
+ Cluster data, and the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option skips over Clusters to
33
+ read subsequent tags. See
32
34
  L<http://www.matroska.org/technical/specs/index.html> for the official
33
35
  Matroska specification.
34
36
  },
@@ -269,10 +271,11 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
269
271
  }
270
272
  ],
271
273
  0x3314f => { Name => 'TrackTimecodeScale',Format => 'float' },
272
- 0x137f => { Name => 'TrackOffset', Format => 'signed', Unknown => 1 },
274
+ 0x137f => { Name => 'TrackOffset', Format => 'signed', Unknown => 1 },
273
275
  0x15ee => { Name => 'MaxBlockAdditionID',Format => 'unsigned', Unknown => 1 },
274
- 0x136e => { Name => 'TrackName', Format => 'utf8' },
275
- 0x2b59c => { Name => 'TrackLanguage', Format => 'string' },
276
+ 0x136e => { Name => 'TrackName', Format => 'utf8' },
277
+ 0x2b59c => { Name => 'TrackLanguage', Format => 'string' },
278
+ 0x2b59d => { Name => 'TrackLanguageIETF', Format => 'string' },
276
279
  0x06 => [
277
280
  {
278
281
  Name => 'VideoCodecID',
@@ -743,7 +746,8 @@ sub ProcessMKV($$)
743
746
 
744
747
  # set flag to process entire file (otherwise we stop at the first Cluster)
745
748
  my $verbose = $et->Options('Verbose');
746
- my $processAll = ($verbose or $et->Options('Unknown') > 1);
749
+ my $processAll = ($verbose or $et->Options('Unknown') > 1) ? 2 : 0;
750
+ ++$processAll if $et->Options('ExtractEmbedded');
747
751
  $$et{TrackTypes} = \%trackTypes; # store Track types reference
748
752
  my $oldIndent = $$et{INDENT};
749
753
  my $chapterNum = 0;
@@ -786,16 +790,20 @@ sub ProcessMKV($$)
786
790
  my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
787
791
  # just fall through into the contained EBML elements
788
792
  if ($tagInfo and $$tagInfo{SubDirectory}) {
789
- # stop processing at first cluster unless we are in verbose mode
790
- last if $$tagInfo{Name} eq 'Cluster' and not $processAll;
791
- $$et{INDENT} .= '| ';
792
- $et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
793
- push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ];
794
- if ($$tagInfo{Name} eq 'ChapterAtom') {
795
- $$et{SET_GROUP1} = 'Chapter' . (++$chapterNum);
796
- $trackIndent = $$et{INDENT};
793
+ # stop processing at first cluster unless we are using -v -U or -ee
794
+ if ($$tagInfo{Name} eq 'Cluster' and $processAll < 2) {
795
+ last unless $processAll;
796
+ undef $tagInfo; # just skip the Cluster when -ee is used
797
+ } else {
798
+ $$et{INDENT} .= '| ';
799
+ $et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
800
+ push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ];
801
+ if ($$tagInfo{Name} eq 'ChapterAtom') {
802
+ $$et{SET_GROUP1} = 'Chapter' . (++$chapterNum);
803
+ $trackIndent = $$et{INDENT};
804
+ }
805
+ next;
797
806
  }
798
- next;
799
807
  }
800
808
  last if $unknownSize;
801
809
  if ($pos + $size > $dataLen) {
@@ -63,7 +63,7 @@ use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
64
  use Image::ExifTool::XMP;
65
65
 
66
- $VERSION = '4.08';
66
+ $VERSION = '4.09';
67
67
 
68
68
  sub LensIDConv($$$);
69
69
  sub ProcessNikonAVI($$$);
@@ -1624,6 +1624,11 @@ my %base64coord = (
1624
1624
  3 => 'Small',
1625
1625
  },
1626
1626
  },
1627
+ 0x003f => { #https://github.com/darktable-org/darktable/issues/12282
1628
+ Name => 'WhiteBalanceFineTune',
1629
+ Writable => 'rational64s',
1630
+ Count => 2,
1631
+ },
1627
1632
  0x0045 => { #IB
1628
1633
  Name => 'CropArea',
1629
1634
  Notes => 'left, top, width, height',
@@ -21,7 +21,7 @@ use vars qw($VERSION);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
  use Image::ExifTool::Exif;
23
23
 
24
- $VERSION = '1.25';
24
+ $VERSION = '1.26';
25
25
 
26
26
  sub ProcessJpgFromRaw($$$);
27
27
  sub WriteJpgFromRaw($$$);
@@ -218,6 +218,7 @@ my %panasonicWhiteBalance = ( #forum9396
218
218
  0x30 => { Name => 'CropLeft', Writable => 'int16u' },
219
219
  0x31 => { Name => 'CropBottom', Writable => 'int16u' },
220
220
  0x32 => { Name => 'CropRight', Writable => 'int16u' },
221
+ # 0x44 - may contain another pointer to the raw data starting at byte 2 in this data (DC-GH6)
221
222
  0x10f => {
222
223
  Name => 'Make',
223
224
  Groups => { 2 => 'Camera' },
@@ -737,6 +738,7 @@ sub WriteDistortionInfo($$$)
737
738
  # 2 - value count
738
739
  # 3 - reference to list of original offset values
739
740
  # 4 - IFD format number
741
+ # 5 - (pointer to StripOffsets value added by this PatchRawDataOffset routine)
740
742
  sub PatchRawDataOffset($$$)
741
743
  {
742
744
  my ($offsetInfo, $raf, $ifd) = @_;
@@ -745,15 +747,26 @@ sub PatchRawDataOffset($$$)
745
747
  my $rawDataOffset = $$offsetInfo{0x118};
746
748
  my $err;
747
749
  $err = 1 unless $ifd == 0;
748
- $err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
749
- if ($rawDataOffset) {
750
+ if ($stripOffsets or $stripByteCounts) {
751
+ $err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
752
+ } else {
753
+ # the DC-GH6 and DC-GH5M2 write RawDataOffset with no Strip tags, so we need
754
+ # to create fake StripByteCounts information for copying the data
755
+ # (disable this until SilkyPix and Adobe utilities can deal with a variable
756
+ # RawDataOffset, see https://exiftool.org/forum/index.php?topic=13861.0 --
757
+ # so these files will continue to give a "No size tag" error when writing)
758
+ # $stripByteCounts = $$offsetInfo{0x117} = [ $PanasonicRaw::Main{0x117}, 0, 1, [ 0 ], 4 ];
759
+ }
760
+ if ($rawDataOffset and not $err) {
750
761
  $err = 1 unless $$rawDataOffset[2] == 1;
751
- $err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
762
+ if ($stripOffsets) {
763
+ $err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
764
+ }
752
765
  }
753
766
  $err and return 'Unsupported Panasonic/Leica RAW variant';
754
767
  if ($rawDataOffset) {
755
768
  # update StripOffsets along with this tag if it contains a reasonable value
756
- unless ($$stripOffsets[3][0] == 0xffffffff) {
769
+ if ($stripOffsets and $$stripOffsets[3][0] != 0xffffffff) {
757
770
  # save pointer to StripOffsets value for updating later
758
771
  push @$rawDataOffset, $$stripOffsets[1];
759
772
  }