exiftool-vendored.pl 12.43.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 (41) hide show
  1. package/bin/Changes +45 -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 +26 -22
  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/DarwinCore.pm +1 -0
  12. package/bin/lib/Image/ExifTool/EXE.pm +9 -1
  13. package/bin/lib/Image/ExifTool/Exif.pm +5 -5
  14. package/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  15. package/bin/lib/Image/ExifTool/FlashPix.pm +9 -1
  16. package/bin/lib/Image/ExifTool/FujiFilm.pm +3 -1
  17. package/bin/lib/Image/ExifTool/GPS.pm +21 -1
  18. package/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -1
  19. package/bin/lib/Image/ExifTool/ID3.pm +1 -1
  20. package/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  21. package/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  22. package/bin/lib/Image/ExifTool/Nikon.pm +70 -24
  23. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +18 -5
  24. package/bin/lib/Image/ExifTool/Parrot.pm +95 -2
  25. package/bin/lib/Image/ExifTool/QuickTime.pm +86 -4
  26. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +7 -4
  27. package/bin/lib/Image/ExifTool/README +3 -1
  28. package/bin/lib/Image/ExifTool/Sony.pm +8 -1
  29. package/bin/lib/Image/ExifTool/TagLookup.pm +34 -8
  30. package/bin/lib/Image/ExifTool/TagNames.pod +94 -25
  31. package/bin/lib/Image/ExifTool/Validate.pm +3 -3
  32. package/bin/lib/Image/ExifTool/WriteExif.pl +81 -22
  33. package/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  34. package/bin/lib/Image/ExifTool/Writer.pl +7 -4
  35. package/bin/lib/Image/ExifTool/XMP.pm +7 -3
  36. package/bin/lib/Image/ExifTool/XMP2.pl +11 -4
  37. package/bin/lib/Image/ExifTool.pm +1 -1
  38. package/bin/lib/Image/ExifTool.pod +6 -5
  39. package/bin/perl-Image-ExifTool.spec +1 -1
  40. package/bin/pp_build_exe.args +4 -4
  41. package/package.json +1 -1
package/bin/Changes CHANGED
@@ -7,6 +7,50 @@ 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
+
38
+ July 21, 2022 - Version 12.44
39
+
40
+ - Added a few new Sony lenses (thanks Jos Roost)
41
+ - Decode Accelerometer and Gyroscope data from ARCore videos
42
+ - Decode a couple of new Motorola tags (thanks Neal Krawetz)
43
+ - Decode FujiFilm FirmwareVersion (thanks Justin Arkinson)
44
+ - Decode MetaType for timed metadata in videos
45
+ - Decode a number of new Nikon Z tags (thanks Warren Hatch)
46
+ - Extract more types of embedded images from FlashPix-format files
47
+ - Made Composite GPSLatitude and GPSLongitude writable for setting GPS
48
+ coordinates and reference directions with one assignment
49
+ - Fixed bug introduced in 12.39 which broke extraction of timed GPS from some
50
+ INNOVV videos
51
+ - Fixed bug introduced in 12.43 which broke extraction of timed GPSDateTime
52
+ from Insta360 videos
53
+
10
54
  July 6, 2022 - Version 12.43
11
55
 
12
56
  - Added the ability to geotag from Google Takeout JSON files
@@ -99,6 +143,7 @@ Jan. 13, 2022 - Version 12.39
99
143
  - Added a new Pentax LensType (thanks Christian Shulz)
100
144
  - Added a couple of new Nikon LensID's
101
145
  - Added support for Nikon NKSC sidecar files
146
+ - Decode another type of timed GPS from MP4 videos
102
147
  - Decode more tags for the Nikon Z7 and Z9 (thanks Warren Hatch)
103
148
  - Decode a couple more FLIR tags
104
149
  - Extract ZIP file comments
package/bin/META.json CHANGED
@@ -47,6 +47,6 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.43",
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.43
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.43.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.43
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.43';
14
+ my $version = '12.45';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -663,7 +663,7 @@ for (;;) {
663
663
  }
664
664
  $group = $2;
665
665
  shift;
666
- $group =~ /IFD/i and Warn("Can't list tags for specific IFD\n"), next;
666
+ $group =~ /IFD/i and Warn("Can't list tags for specific IFD\n"), $helped=1, next;
667
667
  $group =~ /^(all|\*)$/ and undef $group;
668
668
  } else {
669
669
  $pass or next;
@@ -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.43 --
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) {
@@ -195,6 +195,7 @@ my %event = (
195
195
  # new, ref forum13707
196
196
  degreeOfEstablishment => { },
197
197
  georeferenceVerificationStatus => { },
198
+ pathway => { },
198
199
  recordedByID => { },
199
200
  },
200
201
  },
@@ -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
  }
@@ -298,6 +298,7 @@ my %fpxFileType = (
298
298
  %Image::ExifTool::FlashPix::Main = (
299
299
  PROCESS_PROC => \&ProcessFPXR,
300
300
  GROUPS => { 2 => 'Image' },
301
+ VARS => { LONG_TAGS => 0 },
301
302
  NOTES => q{
302
303
  The FlashPix file format, introduced in 1996, was developed by Kodak,
303
304
  Hewlett-Packard and Microsoft. Internally the FPX file structure mimics
@@ -480,6 +481,12 @@ my %fpxFileType = (
480
481
  return $val;
481
482
  },
482
483
  },
484
+ IeImg => {
485
+ Name => 'EmbeddedImage',
486
+ Notes => 'embedded images in Scene7 vignette VNT files',
487
+ Groups => { 2 => 'Preview' },
488
+ Binary => 1,
489
+ },
483
490
  );
484
491
 
485
492
  # Summary Information properties
@@ -2255,7 +2262,8 @@ sub ProcessFPX($$)
2255
2262
  # remove instance number or class ID from tag if necessary
2256
2263
  $tagInfo = $et->GetTagInfo($tagTablePtr, $1) if
2257
2264
  ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
2258
- ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
2265
+ ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1}) or
2266
+ ($tag =~ /(.*)_[0-9]{4}$/s and $$tagTablePtr{$1}); # IeImg instances
2259
2267
  }
2260
2268
 
2261
2269
  my $lSib = Get32u(\$dir, $pos + 0x44); # left sibling
@@ -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.81';
34
+ $VERSION = '1.82';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -763,6 +763,8 @@ my %faceCategories = (
763
763
  },
764
764
  PrintConvInv => '$val=~/(0x[0-9a-f]+)/i; hex $1',
765
765
  },
766
+ 0x1447 => { Name => 'FirmwareVersion', Writable => 'string' },
767
+ 0x1448 => { Name => 'FirmwareVersion2', Writable => 'string' },
766
768
  0x3803 => { #forum10037
767
769
  Name => 'VideoRecordingMode',
768
770
  Groups => { 2 => 'Video' },
@@ -12,7 +12,7 @@ use strict;
12
12
  use vars qw($VERSION);
13
13
  use Image::ExifTool::Exif;
14
14
 
15
- $VERSION = '1.53';
15
+ $VERSION = '1.54';
16
16
 
17
17
  my %coordConv = (
18
18
  ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
@@ -360,21 +360,41 @@ my %coordConv = (
360
360
  # which must therefore require this module as necessary
361
361
  GPSLatitude => {
362
362
  SubDoc => 1, # generate for all sub-documents
363
+ Writable => 1,
364
+ Avoid => 1,
365
+ Priority => 1, # (necessary because Avoid sets default Priority to 0)
363
366
  Require => {
364
367
  0 => 'GPS:GPSLatitude',
365
368
  1 => 'GPS:GPSLatitudeRef',
366
369
  },
370
+ WriteAlso => {
371
+ 'GPS:GPSLatitude' => '$val',
372
+ 'GPS:GPSLatitudeRef' => '(defined $val and $val < 0) ? "S" : "N"',
373
+ },
367
374
  ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]',
368
375
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
376
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
369
377
  },
370
378
  GPSLongitude => {
371
379
  SubDoc => 1, # generate for all sub-documents
380
+ Writable => 1,
381
+ Avoid => 1,
382
+ Priority => 1,
383
+ Require => {
384
+ 0 => 'GPS:GPSLongitude',
385
+ 1 => 'GPS:GPSLongitudeRef',
386
+ },
387
+ WriteAlso => {
388
+ 'GPS:GPSLongitude' => '$val',
389
+ 'GPS:GPSLongitudeRef' => '(defined $val and $val < 0) ? "W" : "E"',
390
+ },
372
391
  Require => {
373
392
  0 => 'GPS:GPSLongitude',
374
393
  1 => 'GPS:GPSLongitudeRef',
375
394
  },
376
395
  ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]',
377
396
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
397
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
378
398
  },
379
399
  GPSAltitude => {
380
400
  SubDoc => [1,3], # generate for sub-documents if Desire 1 or 3 has a chance to exist
@@ -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) {