exiftool-vendored.exe 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 (31) hide show
  1. package/bin/exiftool_files/Changes +28 -0
  2. package/bin/exiftool_files/README +2 -2
  3. package/bin/exiftool_files/exiftool.pl +16 -13
  4. package/bin/exiftool_files/fmt_files/gpx.fmt +3 -0
  5. package/bin/exiftool_files/fmt_files/gpx_wpt.fmt +3 -0
  6. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +7 -4
  7. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +17 -11
  8. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +7 -8
  9. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +9 -1
  10. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +5 -5
  11. package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +4 -3
  12. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +2 -2
  13. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +2 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +1 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/Matroska.pm +24 -16
  16. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +6 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +18 -5
  18. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +80 -4
  19. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +2 -2
  20. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +2 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +12 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +36 -13
  23. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +3 -3
  24. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +81 -22
  25. package/bin/exiftool_files/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  26. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +5 -2
  27. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +7 -3
  28. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +11 -4
  29. package/bin/exiftool_files/lib/Image/ExifTool.pm +1 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool.pod +6 -5
  31. package/package.json +1 -1
@@ -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)
@@ -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.
@@ -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
  my $exePath;
@@ -2305,7 +2305,7 @@ TAG: foreach $tag (@foundTags) {
2305
2305
  if (ref $val) {
2306
2306
  # happens with -X, -j or -php when combined with -b:
2307
2307
  if (defined $binaryOutput and not $binaryOutput and $$et{TAG_INFO}{$tag}{Protected}) {
2308
- # avoid extracting Protected binary tags (eg. data blocks) [insider information]
2308
+ # avoid extracting Unsafe binary tags (eg. data blocks) [insider information]
2309
2309
  my $lcTag = lc $tag;
2310
2310
  $lcTag =~ s/ .*//;
2311
2311
  next unless $$et{REQ_TAG_LOOKUP}{$lcTag} or ($$et{OPTIONS}{RequestAll} || 0) > 2;
@@ -5010,12 +5010,12 @@ OPTIONS
5010
5010
 
5011
5011
  8) With the redirection feature, copying a tag directly (ie.
5012
5012
  "'-*DSTTAG*<*SRCTAG*'") is not the same as interpolating its value
5013
- inside a string (ie. "'-*DSTTAG*<$*SRCTAG*'") for list-type tags,
5014
- shortcut tags, tag names containing wildcards, or UserParam
5015
- variables. When copying directly, the values of each matching
5016
- source tag are copied individually to the destination tag (as if
5017
- they were separate assignments). However, when interpolated inside
5018
- a string, list items and the values of shortcut tags are
5013
+ inside a string (ie. "'-*DSTTAG*<$*SRCTAG*'") for source tags which
5014
+ are list-type tags, shortcut tags, tag names containing wildcards,
5015
+ or UserParam variables. When copying directly, the values of each
5016
+ matching source tag are copied individually to the destination tag
5017
+ (as if they were separate assignments). However, when interpolated
5018
+ inside a string, list items and the values of shortcut tags are
5019
5019
  concatenated (with a separator set by the -sep option), and
5020
5020
  wildcards are not allowed. Also, UserParam variables are available
5021
5021
  only when interpolated in a string. Another difference is that a
@@ -5338,7 +5338,9 @@ OPTIONS
5338
5338
  information (see -t for details). The JSON output is UTF-8
5339
5339
  regardless of any -L or -charset option setting, but the UTF-8
5340
5340
  validation is disabled if a character set other than UTF-8 is
5341
- specified.
5341
+ specified. Note that ExifTool quotes JSON values only if they don't
5342
+ look like numbers (regardless of the original storage format or the
5343
+ relevant metadata specification).
5342
5344
 
5343
5345
  If *JSONFILE* is specified, the file is imported and the tag
5344
5346
  definitions from the file are used to set tag values on a per-file
@@ -5492,7 +5494,7 @@ OPTIONS
5492
5494
 
5493
5495
  produces output like this:
5494
5496
 
5495
- -- Generated by ExifTool 12.44 --
5497
+ -- Generated by ExifTool 12.45 --
5496
5498
  File: a.jpg - 2003:10:31 15:44:19
5497
5499
  (f/5.6, 1/60s, ISO 100)
5498
5500
  File: b.jpg - 2006:05:23 11:57:38
@@ -6008,8 +6010,9 @@ OPTIONS
6008
6010
 
6009
6011
  3) Tags in the string are interpolated the same way as with -p
6010
6012
  before the expression is evaluated. In this interpolation, $/ is
6011
- converted to a newline and $$ represents a single "$" symbol (so
6012
- Perl variables, if used, require a double "$").
6013
+ converted to a newline and $$ represents a single "$" symbol. So
6014
+ Perl variables, if used, require a double "$", and regular
6015
+ expressions ending in $/ must use $$/ instead.
6013
6016
 
6014
6017
  4) The condition may only test tags from the file being processed.
6015
6018
  To process one file based on tags from another, two steps are
@@ -7136,7 +7139,7 @@ GEOTAGGING EXAMPLES
7136
7139
  exiftool -geotag "tracks/*.log" -r dir
7137
7140
  Read all track logs from the "tracks" directory.
7138
7141
 
7139
- exiftool -p gpx.fmt -d %Y-%m-%dT%H:%M:%SZ dir > out.gpx
7142
+ exiftool -p gpx.fmt dir > out.gpx
7140
7143
  Generate a GPX track log from all images in directory "dir". This
7141
7144
  example uses the "gpx.fmt" file included in the full ExifTool
7142
7145
  distribution package and assumes that the images in "dir" have all
@@ -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
  }
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
47
47
  use Image::ExifTool::Exif;
48
48
  use Image::ExifTool::GPS;
49
49
 
50
- $VERSION = '2.75';
50
+ $VERSION = '2.76';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -556,12 +556,16 @@ my %eeBox2 = (
556
556
  mdat => { Name => 'MediaData', Unknown => 1, Binary => 1 },
557
557
  'mdat-size' => {
558
558
  Name => 'MediaDataSize',
559
+ RawConv => '$$self{MediaDataSize} = $val',
559
560
  Notes => q{
560
561
  not a real tag ID, this tag represents the size of the 'mdat' data in bytes
561
562
  and is used in the AvgBitrate calculation
562
563
  },
563
564
  },
564
- 'mdat-offset' => 'MediaDataOffset',
565
+ 'mdat-offset' => {
566
+ Name => 'MediaDataOffset',
567
+ RawConv => '$$self{MediaDataOffset} = $val',
568
+ },
565
569
  junk => { Unknown => 1, Binary => 1 }, #8
566
570
  uuid => [
567
571
  { #9 (MP4 files)
@@ -897,7 +901,7 @@ my %eeBox2 = (
897
901
  },
898
902
  colr => {
899
903
  Name => 'ColorRepresentation',
900
- ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
904
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
901
905
  },
902
906
  pasp => {
903
907
  Name => 'PixelAspectRatio',
@@ -2732,7 +2736,7 @@ my %eeBox2 = (
2732
2736
  },
2733
2737
  },{
2734
2738
  Name => 'ColorRepresentation',
2735
- ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
2739
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
2736
2740
  }],
2737
2741
  irot => {
2738
2742
  Name => 'Rotation',
@@ -2792,6 +2796,78 @@ my %eeBox2 = (
2792
2796
  },
2793
2797
  );
2794
2798
 
2799
+ # ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
2800
+ %Image::ExifTool::QuickTime::ColorRep = (
2801
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2802
+ GROUPS => { 2 => 'Video' },
2803
+ FIRST_ENTRY => 0,
2804
+ 0 => { Name => 'ColorProfiles', Format => 'undef[4]' },
2805
+ 4 => {
2806
+ Name => 'ColorPrimaries',
2807
+ Format => 'int16u',
2808
+ PrintConv => {
2809
+ 1 => 'BT.709',
2810
+ 2 => 'Unspecified',
2811
+ 4 => 'BT.470 System M (historical)',
2812
+ 5 => 'BT.470 System B, G (historical)',
2813
+ 6 => 'BT.601',
2814
+ 7 => 'SMPTE 240',
2815
+ 8 => 'Generic film (color filters using illuminant C)',
2816
+ 9 => 'BT.2020, BT.2100',
2817
+ 10 => 'SMPTE 428 (CIE 1921 XYZ)',
2818
+ 11 => 'SMPTE RP 431-2',
2819
+ 12 => 'SMPTE EG 432-1',
2820
+ 22 => 'EBU Tech. 3213-E',
2821
+ },
2822
+ },
2823
+ 6 => {
2824
+ Name => 'TransferCharacteristics',
2825
+ Format => 'int16u',
2826
+ PrintConv => {
2827
+ 0 => 'For future use (0)',
2828
+ 1 => 'BT.709',
2829
+ 2 => 'Unspecified',
2830
+ 3 => 'For future use (3)',
2831
+ 4 => 'BT.470 System M (historical)',
2832
+ 5 => 'BT.470 System B, G (historical)',
2833
+ 6 => 'BT.601',
2834
+ 7 => 'SMPTE 240 M',
2835
+ 8 => 'Linear',
2836
+ 9 => 'Logarithmic (100 : 1 range)',
2837
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
2838
+ 11 => 'IEC 61966-2-4',
2839
+ 12 => 'BT.1361',
2840
+ 13 => 'sRGB or sYCC',
2841
+ 14 => 'BT.2020 10-bit systems',
2842
+ 15 => 'BT.2020 12-bit systems',
2843
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
2844
+ 17 => 'SMPTE ST 428',
2845
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
2846
+ },
2847
+ },
2848
+ 8 => {
2849
+ Name => 'MatrixCoefficients',
2850
+ Format => 'int16u',
2851
+ PrintConv => {
2852
+ 0 => 'Identity matrix',
2853
+ 1 => 'BT.709',
2854
+ 2 => 'Unspecified',
2855
+ 3 => 'For future use (3)',
2856
+ 4 => 'US FCC 73.628',
2857
+ 5 => 'BT.470 System B, G (historical)',
2858
+ 6 => 'BT.601',
2859
+ 7 => 'SMPTE 240 M',
2860
+ 8 => 'YCgCo',
2861
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
2862
+ 10 => 'BT.2020 constant luminance',
2863
+ 11 => 'SMPTE ST 2085 YDzDx',
2864
+ 12 => 'Chromaticity-derived non-constant luminance',
2865
+ 13 => 'Chromaticity-derived constant luminance',
2866
+ 14 => 'BT.2100 ICtCp',
2867
+ },
2868
+ },
2869
+ );
2870
+
2795
2871
  # HEVC configuration (ref https://github.com/MPEGGroup/isobmff/blob/master/IsoLib/libisomediafile/src/HEVCConfigAtom.c)
2796
2872
  %Image::ExifTool::QuickTime::HEVCConfig = (
2797
2873
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -2811,9 +2811,9 @@ sub ScanMediaData($)
2811
2811
  my ($pos, $buf2) = (0, '');
2812
2812
 
2813
2813
  # don't rescan for freeGPS if we already found embedded metadata
2814
- my $dataPos = $$et{VALUE}{MediaDataOffset};
2814
+ my $dataPos = $$et{MediaDataOffset};
2815
2815
  if ($dataPos and not $$et{DOC_COUNT}) {
2816
- $dataLen = $$et{VALUE}{MediaDataSize};
2816
+ $dataLen = $$et{MediaDataSize};
2817
2817
  if ($dataLen) {
2818
2818
  if ($raf->Seek($dataPos, 0)) {
2819
2819
  $$et{FreeGPS2} = { }; # initialize variable space for FreeGPS2()
@@ -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.51';
37
+ $VERSION = '3.52';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -205,6 +205,7 @@ sub PrintInvLensSpec($;$$);
205
205
  49468 => 'Tamron 18-300mm F3.5-6.3 Di III-A VC VXD', #JR (Model B061)
206
206
  49469 => 'Tamron 35-150mm F2-F2.8 Di III VXD', #JR (Model A058)
207
207
  49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
208
+ 49471 => 'Tamron 50-400mm F4.5-6.3 Di III VC VXD', #JR (Model A067)
208
209
 
209
210
  49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
210
211
  49473.1 => 'Viltrox 23mm F1.4 E', #JR
@@ -4436,7 +4436,14 @@ my %tagLookup = (
4436
4436
  'menubuttonreturn' => { 90 => 0xb },
4437
4437
  'menumonitorofftime' => { 279 => '26.1', 280 => '22.1', 282 => '22.1', 283 => '22.1', 287 => '21.1', 288 => '8.2', 289 => '21.1', 292 => '22.1', 293 => '22.1', 294 => '22.1', 295 => 0x35 },
4438
4438
  'menusettingsz7iioffset' => { 260 => 0xceb6 },
4439
+ 'metadataauthority' => { 490 => 'metadataAuthority' },
4440
+ 'metadataauthorityidentifier' => { 490 => [\'metadataAuthority','metadataAuthorityIdentifier'] },
4441
+ 'metadataauthorityname' => { 490 => [\'metadataAuthority','metadataAuthorityName'] },
4439
4442
  'metadatadate' => { 502 => 'MetadataDate' },
4443
+ 'metadatalastedited' => { 490 => 'metadataLastEdited' },
4444
+ 'metadatalasteditor' => { 490 => 'metadataLastEditor' },
4445
+ 'metadatalasteditoridentifier' => { 490 => [\'metadataLastEditor','metadataLastEditorIdentifier'] },
4446
+ 'metadatalasteditorname' => { 490 => [\'metadataLastEditor','metadataLastEditorName'] },
4440
4447
  'metadatamoddate' => { 504 => 'metadataModDate' },
4441
4448
  'metaversion' => { 428 => 0x34 },
4442
4449
  'meterinfo1row1' => { 421 => 0x0, 422 => 0x0 },
@@ -5035,6 +5042,7 @@ my %tagLookup = (
5035
5042
  'parametricshadows' => { 478 => 'ParametricShadows', 480 => 'ParametricShadows' },
5036
5043
  'parametricshadowsplit' => { 478 => 'ParametricShadowSplit', 480 => 'ParametricShadowSplit' },
5037
5044
  'parentalrating' => { 179 => 'WM/ParentalRating' },
5045
+ 'parentid' => { 490 => 'parentId' },
5038
5046
  'parentmediaeventid' => { 468 => 'ParentMediaEventID' },
5039
5047
  'parentmeid' => { 468 => 'ParentMEID' },
5040
5048
  'parentproductid' => { 372 => '@ppi' },
@@ -7036,7 +7044,7 @@ my %tagLookup = (
7036
7044
  'whitebalancebuttonplaybackmode' => { 295 => 0x1c5 },
7037
7045
  'whitebalancecomp' => { 305 => 0x1001 },
7038
7046
  'whitebalancedetected' => { 138 => 0x3fb },
7039
- 'whitebalancefinetune' => { 127 => 0x100a, 184 => 0x38, 186 => 0x112, 226 => 0xb, 387 => 0x1004, 407 => 0x6, 408 => 0x5, 420 => 0x112 },
7047
+ 'whitebalancefinetune' => { 127 => 0x100a, 184 => 0x38, 186 => 0x112, 226 => [0xb,0x3f], 387 => 0x1004, 407 => 0x6, 408 => 0x5, 420 => 0x112 },
7040
7048
  'whitebalancemode' => { 138 => 0x3fa, 355 => 0x1a },
7041
7049
  'whitebalancered' => { 74 => 0x6 },
7042
7050
  'whitebalanceset' => { 336 => 0xa },
@@ -8008,6 +8016,7 @@ my %tagExists = (
8008
8016
  'colorpalette' => 1,
8009
8017
  'colorpopstrength' => 1,
8010
8018
  'colorprimaries' => 1,
8019
+ 'colorprofiles' => 1,
8011
8020
  'colorresolutiondepth' => 1,
8012
8021
  'colorresponseunit' => 1,
8013
8022
  'colors' => 1,
@@ -9793,6 +9802,7 @@ my %tagExists = (
9793
9802
  'marl' => 1,
9794
9803
  'masksubarea' => 1,
9795
9804
  'mastergainadjustment' => 1,
9805
+ 'matrixcoefficients' => 1,
9796
9806
  'matrixworldtocamera' => 1,
9797
9807
  'matrixworldtoscreen' => 1,
9798
9808
  'mattcolor' => 1,
@@ -11744,6 +11754,7 @@ my %tagExists = (
11744
11754
  'trademark' => 1,
11745
11755
  'transactionid' => 1,
11746
11756
  'transfercharacteristic' => 1,
11757
+ 'transfercharacteristics' => 1,
11747
11758
  'transferrange' => 1,
11748
11759
  'transfersequence' => 1,
11749
11760
  'transformation' => 1,
@@ -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 25816 tags, with 16503 unique tag names.
15
+ They contain a total of 25828 tags, with 16515 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
@@ -902,9 +902,9 @@ for the official EXIF 2.32 specification.
902
902
  0xc71f RowInterleaveFactor - no
903
903
  0xc725 ProfileLookTableDims IFD0 int32u[3]!
904
904
  0xc726 ProfileLookTableData IFD0 float[n]!
905
- 0xc740 OpcodeList1 SubIFD undef!
906
- 0xc741 OpcodeList2 SubIFD undef!
907
- 0xc74e OpcodeList3 SubIFD undef!
905
+ 0xc740 OpcodeList1 SubIFD undef~!
906
+ 0xc741 OpcodeList2 SubIFD undef~!
907
+ 0xc74e OpcodeList3 SubIFD undef~!
908
908
  0xc761 NoiseProfile SubIFD double[n]!
909
909
  0xc763 TimeCodes IFD0 int8u[n]
910
910
  0xc764 FrameRate IFD0 rational64s
@@ -4514,10 +4514,11 @@ These tags belong to the ExifTool XMP-iptcCore family 1 group.
4514
4514
 
4515
4515
  =head3 XMP iptcExt Tags
4516
4516
 
4517
- This table contains tags defined by the IPTC Extension schema version 1.6.
4518
- The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
4519
- the family 1 group name. (see
4520
- L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>)
4517
+ This table contains tags defined by the IPTC Extension schema version 1.6
4518
+ and IPTC Video Metadata version 1.3. The actual namespace prefix is
4519
+ "Iptc4xmpExt", but ExifTool shortens this for the family 1 group name. (See
4520
+ L<http://www.iptc.org/standards/photo-metadata/iptc-standard/> and
4521
+ L<https://iptc.org/standards/video-metadata-hub/>.)
4521
4522
 
4522
4523
  These tags belong to the ExifTool XMP-iptcExt family 1 group.
4523
4524
 
@@ -4655,9 +4656,17 @@ These tags belong to the ExifTool XMP-iptcExt family 1 group.
4655
4656
  LocationShownWorldRegion string_+
4656
4657
  MaxAvailHeight integer
4657
4658
  MaxAvailWidth integer
4659
+ MetadataAuthority Entity Struct
4660
+ MetadataAuthorityIdentifier string_+
4661
+ MetadataAuthorityName lang-alt_
4662
+ MetadataLastEdited date
4663
+ MetadataLastEditor Entity Struct
4664
+ MetadataLastEditorIdentifier string_+
4665
+ MetadataLastEditorName lang-alt_
4658
4666
  ModelAge integer+
4659
4667
  OrganisationInImageCode string+
4660
4668
  OrganisationInImageName string+
4669
+ ParentID string
4661
4670
  PersonHeard Entity Struct+
4662
4671
  PersonHeardIdentifier string_+
4663
4672
  PersonHeardName lang-alt_+
@@ -10720,7 +10729,8 @@ imaging cameras by FLIR Systems Inc.
10720
10729
 
10721
10730
  Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
10722
10731
  images. These tags may also be extracted from the first frame of an FLIR
10723
- SEQ file, or all frames if the ExtractEmbedded option is used.
10732
+ SEQ file, or all frames if the ExtractEmbedded option is used. Setting
10733
+ ExtractEmbedded to 2 also the raw thermal data from all frames.
10724
10734
 
10725
10735
  Tag ID Tag Name Writable
10726
10736
  ------ -------- --------
@@ -13506,6 +13516,7 @@ DiMAGE X and Xt.
13506
13516
  0x0039 LocationInfo Nikon LocationInfo
13507
13517
  0x003d BlackLevel int16u[4]
13508
13518
  0x003e ImageSizeRAW yes
13519
+ 0x003f WhiteBalanceFineTune rational64s[2]
13509
13520
  0x0045 CropArea int16u[4]
13510
13521
  0x004e NikonSettings NikonSettings
13511
13522
  0x004f ColorTemperatureAuto int16u
@@ -28359,7 +28370,7 @@ and are not currently writable.
28359
28370
  'av1C' AV1Configuration QuickTime AV1Config
28360
28371
  'clap' CleanAperture no
28361
28372
  'colr' ICC_Profile ICC_Profile
28362
- ColorRepresentation no
28373
+ ColorRepresentation QuickTime ColorRep
28363
28374
  'hvcC' HEVCConfiguration QuickTime HEVCConfig
28364
28375
  'irot' Rotation int8u!
28365
28376
  'ispe' ImageSpatialExtent no
@@ -28381,6 +28392,15 @@ and are not currently writable.
28381
28392
  2.4 ChromaSamplePosition no
28382
28393
  3 InitialDelaySamples? no
28383
28394
 
28395
+ =head3 QuickTime ColorRep Tags
28396
+
28397
+ Index1 Tag Name Writable
28398
+ ------ -------- --------
28399
+ 0 ColorProfiles no
28400
+ 4 ColorPrimaries no
28401
+ 6 TransferCharacteristics no
28402
+ 8 MatrixCoefficients no
28403
+
28384
28404
  =head3 QuickTime HEVCConfig Tags
28385
28405
 
28386
28406
  Index1 Tag Name Writable
@@ -28721,7 +28741,7 @@ Child atoms found in "sinf" and/or "pinf" atoms.
28721
28741
  'avcC' AVCConfiguration? no
28722
28742
  'btrt' BitrateInfo QuickTime Bitrate
28723
28743
  'clap' CleanAperture QuickTime CleanAperture
28724
- 'colr' ColorRepresentation no
28744
+ 'colr' ColorRepresentation QuickTime ColorRep
28725
28745
  'fiel' VideoFieldOrder no
28726
28746
  'gama' Gamma no
28727
28747
  'pasp' PixelAspectRatio no
@@ -29480,8 +29500,10 @@ ARCore accelerometer data.
29480
29500
 
29481
29501
  The following tags are extracted from Matroska multimedia container files.
29482
29502
  This container format is used by file types such as MKA, MKV, MKS and WEBM.
29483
- For speed, ExifTool extracts tags only up to the first Cluster unless the
29484
- Verbose (-v) or Unknown = 2 (-U) option is used. See
29503
+ For speed, by default ExifTool extracts tags only up to the first Cluster.
29504
+ However, the Verbose (-v) and Unknown = 2 (-U) options force processing of
29505
+ Cluster data, and the ExtractEmbedded (-ee) option skips over Clusters to
29506
+ read subsequent tags. See
29485
29507
  L<http://www.matroska.org/technical/specs/index.html> for the official
29486
29508
  Matroska specification.
29487
29509
 
@@ -29663,6 +29685,7 @@ Matroska specification.
29663
29685
  0x3eb5 Signature? no
29664
29686
  0x7670 Projection Matroska Projection
29665
29687
  0x2b59c TrackLanguage no
29688
+ 0x2b59d TrackLanguageIETF no
29666
29689
  0x3314f TrackTimecodeScale no
29667
29690
  0x383e3 FrameRate no
29668
29691
  0x3e383 VideoFrameRate no
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
17
17
  use strict;
18
18
  use vars qw($VERSION %exifSpec);
19
19
 
20
- $VERSION = '1.18';
20
+ $VERSION = '1.19';
21
21
 
22
22
  use Image::ExifTool qw(:Utils);
23
23
  use Image::ExifTool::Exif;
@@ -82,8 +82,8 @@ my %otherSpec = (
82
82
  CR2 => { 0xc5d8 => 1, 0xc5d9 => 1, 0xc5e0 => 1, 0xc640 => 1, 0xc6dc => 1, 0xc6dd => 1 },
83
83
  NEF => { 0x9216 => 1, 0x9217 => 1 },
84
84
  DNG => { 0x882a => 1, 0x9211 => 1, 0x9216 => 1 },
85
- ARW => { 0x7000 => 1, 0x7001 => 1, 0x7010 => 1, 0x7011 => 1, 0x7020 => 1,
86
- 0x7031 => 1, 0x7032 => 1, 0x7034 => 1, 0x7035 => 1, 0x7036 => 1, 0x7037 => 1,
85
+ ARW => { 0x7000 => 1, 0x7001 => 1, 0x7010 => 1, 0x7011 => 1, 0x7020 => 1, 0x7031 => 1,
86
+ 0x7032 => 1, 0x7034 => 1, 0x7035 => 1, 0x7036 => 1, 0x7037 => 1, 0x7038 => 1,
87
87
  0x7310 => 1, 0x7313 => 1, 0x7316 => 1, 0x74c7 => 1, 0x74c8 => 1, 0xa500 => 1 },
88
88
  RW2 => { All => 1 }, # ignore all unknown tags in RW2
89
89
  RWL => { All => 1 },
@@ -586,7 +586,7 @@ sub WriteExif($$$)
586
586
  $et->Error("$str $name directory", 1);
587
587
  }
588
588
  }
589
- my ($index, $dirEnd, $numEntries);
589
+ my ($index, $dirEnd, $numEntries, %hasOldID, $unsorted);
590
590
  if ($dirStart + 4 < $dataLen) {
591
591
  $numEntries = Get16u($dataPt, $dirStart);
592
592
  $dirEnd = $dirStart + 2 + 12 * $numEntries;
@@ -596,19 +596,20 @@ sub WriteExif($$$)
596
596
  return undef unless $n and defined $rtn;
597
597
  $numEntries = $n; # continue processing the entries we have
598
598
  }
599
- # sort entries if necessary (but not in maker notes IFDs)
600
- unless ($inMakerNotes) {
601
- my $lastID = -1;
602
- for ($index=0; $index<$numEntries; ++$index) {
603
- my $tagID = Get16u($dataPt, $dirStart + 2 + 12 * $index);
604
- # check for proper sequence (but ignore null entries at end)
605
- if ($tagID < $lastID and ($tagID or $$tagTablePtr{0})) {
606
- SortIFD($dataPt, $dirStart, $numEntries, $$tagTablePtr{0});
607
- $et->Warn("Entries in $name were out of sequence. Fixed.",1);
608
- last;
609
- }
610
- $lastID = $tagID;
611
- }
599
+ # create lookup for existing tag ID's and determine if directory is sorted
600
+ my $lastID = -1;
601
+ for ($index=0; $index<$numEntries; ++$index) {
602
+ my $tagID = Get16u($dataPt, $dirStart + 2 + 12 * $index);
603
+ $hasOldID{$tagID} = 1;
604
+ # check for proper sequence (but ignore null entries at end)
605
+ $unsorted = 1 if $tagID < $lastID and ($tagID or $$tagTablePtr{0});
606
+ $lastID = $tagID;
607
+ }
608
+ # sort entries if out-of-order (but not in maker notes IFDs or RAW files)
609
+ if ($unsorted and not ($inMakerNotes or $et->IsRawType())) {
610
+ SortIFD($dataPt, $dirStart, $numEntries, $$tagTablePtr{0});
611
+ $et->Warn("Entries in $name were out of sequence. Fixed.",1);
612
+ $unsorted = 0;
612
613
  }
613
614
  } else {
614
615
  $numEntries = 0;
@@ -616,11 +617,12 @@ sub WriteExif($$$)
616
617
  }
617
618
 
618
619
  # loop through new values and accumulate all information for this IFD
619
- my (%set, %mayDelete, $tagInfo);
620
+ my (%set, %mayDelete, $tagInfo, %hasNewID);
620
621
  my $wrongDir = $crossDelete{$dirName};
621
622
  my @newTagInfo = $et->GetNewTagInfoList($tagTablePtr);
622
623
  foreach $tagInfo (@newTagInfo) {
623
624
  my $tagID = $$tagInfo{TagID};
625
+ $hasNewID{$tagID} = 1;
624
626
  # must evaluate Condition later when we have all DataMember's available
625
627
  $set{$tagID} = (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) ? '' : $tagInfo;
626
628
  }
@@ -972,7 +974,7 @@ Entry: for (;;) {
972
974
  $readCount = $oldSize / $formatSize[$readFormat];
973
975
  }
974
976
  }
975
- if ($oldID <= $lastTagID and not $inMakerNotes) {
977
+ if ($oldID <= $lastTagID and not ($inMakerNotes or $et->IsRawType())) {
976
978
  my $str = $oldInfo ? "$$oldInfo{Name} tag" : sprintf('tag 0x%x',$oldID);
977
979
  if ($oldID == $lastTagID) {
978
980
  $et->Warn("Duplicate $str in $name");
@@ -1006,6 +1008,23 @@ Entry: for (;;) {
1006
1008
  }
1007
1009
  } else {
1008
1010
  $isNew = $oldID <=> $newID;
1011
+ # special logic needed if directory has out-of-order entries
1012
+ if ($unsorted and $isNew) {
1013
+ if ($isNew > 0 and $hasOldID{$newID}) {
1014
+ # we wanted to create the new tag, but an old tag
1015
+ # does exist with this ID, so defer writing the new tag
1016
+ $isNew = -1;
1017
+ }
1018
+ if ($isNew < 0 and $hasNewID{$oldID}) {
1019
+ # we wanted to write the old tag, but we have
1020
+ # a new tag with this ID, so move it up in the order
1021
+ my @tmpTags = ( $oldID );
1022
+ $_ == $oldID or push @tmpTags, $_ foreach @newTags;
1023
+ @newTags = @tmpTags;
1024
+ $newID = $oldID;
1025
+ $isNew = 0;
1026
+ }
1027
+ }
1009
1028
  }
1010
1029
  my $newInfo = $oldInfo;
1011
1030
  my $newFormat = $oldFormat;
@@ -2170,17 +2189,39 @@ NoOverwrite: next if $isNew > 0;
2170
2189
  my @offsetList;
2171
2190
  if ($ifd >= 0) {
2172
2191
  my $offsetInfo = $offsetInfo[$ifd] or next;
2192
+ if ($$offsetInfo{0x111} and $$offsetInfo{0x144}) {
2193
+ # SubIFD may contain double-referenced data as both strips and tiles
2194
+ # for Sony ARW files when SonyRawFileType is "Lossless Compressed RAW 2"
2195
+ if ($dirName eq 'SubIFD' and $$et{TIFF_TYPE} eq 'ARW' and
2196
+ $$offsetInfo{0x117} and $$offsetInfo{0x145} and
2197
+ $$offsetInfo{0x111}[2]==1) # (must be a single strip or the tile offsets could get out of sync)
2198
+ {
2199
+ # some Sony ARW images contain double-referenced raw data stored as both strips
2200
+ # and tiles. Copy the data using only the strip tags, but store the TileOffets
2201
+ # information for updating later (see PanasonicRaw:PatchRawDataOffset for a
2202
+ # description of offsetInfo elements)
2203
+ $$offsetInfo{0x111}[5] = $$offsetInfo{0x144}; # hack to save TileOffsets
2204
+ # delete tile information from offsetInfo because we will copy as strips
2205
+ delete $$offsetInfo{0x144};
2206
+ delete $$offsetInfo{0x145};
2207
+ } else {
2208
+ $et->Error("TIFF $dirName contains both strip and tile data");
2209
+ }
2210
+ }
2173
2211
  # patch Panasonic RAW/RW2 StripOffsets/StripByteCounts if necessary
2174
2212
  my $stripOffsets = $$offsetInfo{0x111};
2175
- if ($stripOffsets and $$stripOffsets[0]{PanasonicHack}) {
2213
+ my $rawDataOffset = $$offsetInfo{0x118};
2214
+ if ($stripOffsets and $$stripOffsets[0]{PanasonicHack} or
2215
+ $rawDataOffset and $$rawDataOffset[0]{PanasonicHack})
2216
+ {
2176
2217
  require Image::ExifTool::PanasonicRaw;
2177
2218
  my $err = Image::ExifTool::PanasonicRaw::PatchRawDataOffset($offsetInfo, $raf, $ifd);
2178
2219
  $err and $et->Error($err);
2179
2220
  }
2180
2221
  my $tagID;
2181
- # loop through all tags in reverse order so we save thumbnail
2222
+ # loop through all tags in reverse numerical order so we save thumbnail
2182
2223
  # data before main image data if both exist in the same IFD
2183
- foreach $tagID (reverse sort keys %$offsetInfo) {
2224
+ foreach $tagID (reverse sort { $a <=> $b } keys %$offsetInfo) {
2184
2225
  my $tagInfo = $$offsetInfo{$tagID}[0];
2185
2226
  next unless $$tagInfo{IsOffset}; # handle byte counts with offsets
2186
2227
  my $sizeInfo = $$offsetInfo{$$tagInfo{OffsetPair}};
@@ -2406,10 +2447,28 @@ NoOverwrite: next if $isNew > 0;
2406
2447
  # also add to subIfdDataFixup if necessary
2407
2448
  $subIfdDataFixup->AddFixup($offsetPos, $dataTag) if $subIfdDataFixup;
2408
2449
  # must also (sometimes) update StripOffsets in Panasonic RW2 images
2450
+ # and TileOffsets in Sony ARW images
2409
2451
  my $otherPos = $$offsetPair[0][5];
2410
- if ($otherPos and $$tagInfo{PanasonicHack}) {
2411
- Set32u($newOffset, \$newData, $otherPos);
2412
- $fixup->AddFixup($otherPos, $dataTag);
2452
+ if ($otherPos) {
2453
+ if ($$tagInfo{PanasonicHack}) {
2454
+ Set32u($newOffset, \$newData, $otherPos);
2455
+ $fixup->AddFixup($otherPos, $dataTag);
2456
+ } elsif (ref $otherPos eq 'ARRAY') {
2457
+ # the image data was copied as one large strip, and is double-referenced
2458
+ # as tile data, so all we need to do now is properly update the tile offsets
2459
+ my $oldRawDataOffset = $$offsetPair[0][3][0];
2460
+ my $count = $$otherPos[2];
2461
+ my $i;
2462
+ # point to offsets in value data if more than one pointer
2463
+ $$otherPos[1] = Get32u(\$newData, $$otherPos[1]) if $count > 1;
2464
+ for ($i=0; $i<$count; ++$i) {
2465
+ my $oldTileOffset = $$otherPos[3][$i];
2466
+ my $ptrPos = $$otherPos[1] + 4 * $i;
2467
+ Set32u($newOffset + $oldTileOffset - $oldRawDataOffset, \$newData, $ptrPos);
2468
+ $fixup->AddFixup($ptrPos, $dataTag);
2469
+ $subIfdDataFixup->AddFixup($ptrPos, $dataTag) if $subIfdDataFixup;
2470
+ }
2471
+ }
2413
2472
  }
2414
2473
  if ($ifd >= 0) {
2415
2474
  # buff length must be even (Note: may have changed since $size was set)
@@ -334,13 +334,9 @@ sub DoWriteIPTC($$$)
334
334
  # - improves speed
335
335
  # - avoids changing current MD5 digest unnecessarily
336
336
  # - avoids adding mandatory tags unless some other IPTC is changed
337
- unless (exists $$et{EDIT_DIRS}{$$dirInfo{DirName}} or
337
+ return undef unless exists $$et{EDIT_DIRS}{$$dirInfo{DirName}} or
338
338
  # standard IPTC tags in other locations should be edited too (eg. AFCP_IPTC)
339
- ($tagTablePtr eq \%Image::ExifTool::IPTC::Main and exists $$et{EDIT_DIRS}{IPTC}))
340
- {
341
- print $out "$$et{INDENT} [nothing changed]\n" if $verbose;
342
- return undef;
343
- }
339
+ ($tagTablePtr eq \%Image::ExifTool::IPTC::Main and exists $$et{EDIT_DIRS}{IPTC});
344
340
  my $dataPt = $$dirInfo{DataPt};
345
341
  unless ($dataPt) {
346
342
  my $emptyData = '';
@@ -4242,7 +4242,10 @@ sub WriteDirectory($$$;$)
4242
4242
  $$self{DIR_NAME} = $oldDir;
4243
4243
  @$self{'Compression','SubfileType'} = @save;
4244
4244
  SetByteOrder($saveOrder);
4245
- print $out " Deleting $name\n" if $out and defined $newData and not length $newData;
4245
+ if ($out) {
4246
+ print $out " Deleting $name\n" if defined $newData and not length $newData;
4247
+ print $out "$$self{INDENT} [nothing changed in $dirName]\n" if $$self{CHANGED} == $oldChanged;
4248
+ }
4246
4249
  return $newData;
4247
4250
  }
4248
4251
 
@@ -4531,7 +4534,7 @@ sub DumpUnknownTrailer($$)
4531
4534
  # add to Preview block list if valid and in the trailer
4532
4535
  $image{$prePos} = [$tag, $preLen] if $prePos and $preLen and $prePos+$preLen > $pos;
4533
4536
  last if $lastOne; # checked all images
4534
- # look for MPF images (in the the proper order)
4537
+ # look for MPF images (in the proper order)
4535
4538
  ++$mpImageNum;
4536
4539
  $prePos = $$self{VALUE}{"MPImageStart ($mpImageNum)"};
4537
4540
  if (defined $prePos) {
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.51';
53
+ $VERSION = '3.52';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -3447,8 +3447,12 @@ NoLoop:
3447
3447
  } else {
3448
3448
  $val = ConvertXMPDate($val, $new) if $new or $fmt eq 'date';
3449
3449
  }
3450
- if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean') {
3451
- $et->WarnOnce("Boolean value for XMP-$ns:$$tagInfo{Name} should be capitalized",1);
3450
+ if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean' and $val!~/^True|False$/) {
3451
+ if ($val =~ /^true|false$/) {
3452
+ $et->WarnOnce("Boolean value for XMP-$ns:$$tagInfo{Name} should be capitalized",1);
3453
+ } else {
3454
+ $et->WarnOnce(qq(Boolean value for XMP-$ns:$$tagInfo{Name} should be "True" or "False"),1);
3455
+ }
3452
3456
  }
3453
3457
  # protect against large binary data in unknown tags
3454
3458
  $$tagInfo{Binary} = 1 if $new and length($val) > 65536;
@@ -538,10 +538,11 @@ my %sImageRegion = ( # new in 1.5
538
538
  NAMESPACE => 'Iptc4xmpExt',
539
539
  TABLE_DESC => 'XMP IPTC Extension',
540
540
  NOTES => q{
541
- This table contains tags defined by the IPTC Extension schema version 1.6.
542
- The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
543
- the family 1 group name. (see
544
- L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>)
541
+ This table contains tags defined by the IPTC Extension schema version 1.6
542
+ and IPTC Video Metadata version 1.3. The actual namespace prefix is
543
+ "Iptc4xmpExt", but ExifTool shortens this for the family 1 group name. (See
544
+ L<http://www.iptc.org/standards/photo-metadata/iptc-standard/> and
545
+ L<https://iptc.org/standards/video-metadata-hub/>.)
545
546
  },
546
547
  AboutCvTerm => {
547
548
  Struct => \%sCVTermDetails,
@@ -796,6 +797,12 @@ my %sImageRegion = ( # new in 1.5
796
797
  },
797
798
  PlanningRef => { List => 'Bag', Struct => \%sEntityWithRole },
798
799
  audioBitsPerSample => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
800
+ # new IPTC video metadata 1.3 properties
801
+ # (ref https://iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.3.html)
802
+ metadataLastEdited => { Groups => { 2 => 'Time' }, %dateTimeInfo },
803
+ metadataLastEditor => { Struct => \%sEntity },
804
+ metadataAuthority => { Struct => \%sEntity },
805
+ parentId => { Name => 'ParentID' },
799
806
  # new IPTC Extension schema 1.5 property
800
807
  ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
801
808
  # new Extension 1.6 property
@@ -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);
31
31
 
32
- $VERSION = '12.44';
32
+ $VERSION = '12.45';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -638,11 +638,12 @@ XMP to be extracted.
638
638
 
639
639
  Flag to extract information from embedded documents in EPS files, embedded
640
640
  EPS information and JPEG and Jpeg2000 images in PDF files, embedded MPF
641
- images in JPEG and MPO files, timed metadata in videos, and the resource
642
- fork of Mac OS files. A setting of 2 also causes the H264 video stream in
643
- MP4 files to be parsed until the first SEI message is decoded, or 3 to parse
644
- the entire H264 stream in MP4 videos and the entire M2TS file to look for
645
- any unlisted program containing GPS metadata. Default is undef.
641
+ images in JPEG and MPO files, metadata after the first Cluster in MKV files,
642
+ timed metadata in videos, and the resource fork of Mac OS files. A setting
643
+ of 2 also causes the H264 video stream in MP4 files to be parsed until the
644
+ first SEI message is decoded, or 3 to parse the entire H264 stream in MP4
645
+ videos and the entire M2TS file to look for any unlisted program containing
646
+ GPS metadata. Default is undef.
646
647
 
647
648
  =item FastScan
648
649
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exiftool-vendored.exe",
3
- "version": "12.44.0",
3
+ "version": "12.45.0",
4
4
  "description": "Vendored win32 ExifTool for Node.js",
5
5
  "main": "./index.js",
6
6
  "homepage": "https://github.com/mceachen/exiftool-vendored.exe#readme",