exiftool-vendored.pl 12.76.0 → 12.78.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 +46 -4
  2. package/bin/MANIFEST +4 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +3 -3
  6. package/bin/config_files/example.config +10 -2
  7. package/bin/exiftool +49 -14
  8. package/bin/lib/Image/ExifTool/Canon.pm +12 -9
  9. package/bin/lib/Image/ExifTool/CanonVRD.pm +7 -1
  10. package/bin/lib/Image/ExifTool/Exif.pm +52 -4
  11. package/bin/lib/Image/ExifTool/GPS.pm +5 -3
  12. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  13. package/bin/lib/Image/ExifTool/Geolocation.pm +237 -0
  14. package/bin/lib/Image/ExifTool/Geotag.pm +1 -1
  15. package/bin/lib/Image/ExifTool/HtmlDump.pm +2 -1
  16. package/bin/lib/Image/ExifTool/Import.pm +5 -2
  17. package/bin/lib/Image/ExifTool/JSON.pm +9 -9
  18. package/bin/lib/Image/ExifTool/MWG.pm +1 -0
  19. package/bin/lib/Image/ExifTool/MacOS.pm +19 -4
  20. package/bin/lib/Image/ExifTool/Nikon.pm +2 -2
  21. package/bin/lib/Image/ExifTool/Ogg.pm +3 -2
  22. package/bin/lib/Image/ExifTool/Olympus.pm +3 -1
  23. package/bin/lib/Image/ExifTool/PDF.pm +5 -5
  24. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  25. package/bin/lib/Image/ExifTool/QuickTime.pm +183 -11
  26. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +253 -237
  27. package/bin/lib/Image/ExifTool/TagLookup.pm +77 -3
  28. package/bin/lib/Image/ExifTool/TagNames.pod +113 -4
  29. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +14 -1
  30. package/bin/lib/Image/ExifTool/Writer.pl +9 -8
  31. package/bin/lib/Image/ExifTool.pm +163 -38
  32. package/bin/lib/Image/ExifTool.pod +44 -25
  33. package/bin/perl-Image-ExifTool.spec +2 -2
  34. package/bin/pp_build_exe.args +4 -230
  35. package/package.json +2 -2
package/bin/Changes CHANGED
@@ -7,6 +7,47 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.76. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Mar. 5, 2024 - Version 12.78 - "Geolocation"
11
+
12
+ - Added new Geolocation feature and write-only Geolocate tag
13
+ - Added new config file entry (@Image::ExifTool::UserDefined::Arguments) to
14
+ allow default command-line arguments to be specified
15
+ - Added print conversion for TIFF-EPStandardID
16
+ - Added ability to delete Nextbase information from MP4 videos
17
+ - Decode timed GPS from MP4 videos written by Nextbase software
18
+ - Decode a number of new tags from Nextbase MP4 videos
19
+ - Decode a few new tags from Garmin MP4 videos
20
+ - Extract PreviewJXL images from DNG 1.7 files
21
+ - Generate Validate, ImageDataHash and UserParam tags earlier to allow them to
22
+ be used in UserDefined Composite tags
23
+ - Enhanced the -c option so a minus sign in the format specification prints a
24
+ signed coordinate without a leading "+" for positive numbers
25
+ - Changed formatting of some Accelerometer tags for consistency
26
+ - Changed behaviour of -ee3 option to do a brute-force scan for freeGPS in the
27
+ media data even when referenced by 'gps ' atom
28
+ - Other internal changes to decoding of timed GPS from videos
29
+ - Fixed problem were ExifTool would give up on extracting some types of timed
30
+ GPS from videos after 100 void fixes
31
+ - Fixed bug that could cause runtime error when reading Ogg files
32
+ - Fixed issue where some tags from alternate files using the -fileNUM option
33
+ weren't generated as requested
34
+ - API Changes:
35
+ - Added Geolocation,
36
+ GeolocMaxDist and
37
+ GeolocMinPop API options
38
+
39
+ Feb. 16, 2024 - Version 12.77
40
+
41
+ - Added new Olympus CameraType and LensType value (thanks herb)
42
+ - Added a new Canon Irix LensType
43
+ - Added the ability to delete MacOS XAttrMDItemWhereFroms
44
+ - Decode a few new Canon DPP tags (thanks John Moyer)
45
+ - Decode timed GPS from Adzome GS65H MOV videos
46
+ - Improved handling of XML-unfriendly characters in JSON field names (fixes
47
+ issue where -X option could produce invalid XML when reading JSON with the
48
+ -struct option)
49
+ - Fixed decoding of ShutterCount for Canon G5X-ii CR3 files
50
+
10
51
  Jan. 31, 2024 - Version 12.76 (production release)
11
52
 
12
53
  - Properly implement patch of 12.45 to avoid duplicating raw data when writing
@@ -19,6 +60,7 @@ Jan. 30, 2024 - Version 12.75 (production release)
19
60
  - CORRUPTION WARNING: Fixed bug introduced in 12.45 which could result in
20
61
  corrupted Sony ARW images from some newer models when rewriting lossless
21
62
  compressed ARW images which were previously edited by 12.44 or earlier
63
+ (the corruption is repairable, but requires a special version of ExifTool)
22
64
  - Added ability to read C2PA JUMBF metadata from PDF and SVG files
23
65
  - Added ability to extract JUMBF metadata as a block
24
66
  - Added read support for C2PA (JUMBF-format) files
@@ -547,7 +589,7 @@ Oct. 13, 2022 - Version 12.48
547
589
  "Z" are actually in Zulu time -- a bit of a mess really)
548
590
  - Prevent dynamically-generated Unknown tags from being extracted when the
549
591
  -validate option is used without -u
550
- - Patched to better handle irregular timestamps in streaming GPS of NextBase
592
+ - Patched to better handle irregular timestamps in streaming GPS of Nextbase
551
593
  dashcam videos
552
594
  - Fixed incompatibility with Sigma Photo Pro which could result in Sigma Photo
553
595
  Pro corrupting an ExifTool-edited X3F image (the section length in the
@@ -1419,7 +1461,7 @@ Mar. 19, 2020 - Version 11.92
1419
1461
  - Added a new Nikon LensID (thanks Wolfgang Exler)
1420
1462
  - Decode a few new Leica tags (thanks Tim Gray)
1421
1463
  - Decode AccelerometerData from Samsung Gear 360 videos
1422
- - Fixed a couple of problems decoding timed GPS metadata from NextBase dashcam
1464
+ - Fixed a couple of problems decoding timed GPS metadata from Nextbase dashcam
1423
1465
  videos
1424
1466
  - Fixed problem where -X option could produce invalid XML when reading
1425
1467
  corrupted XMP
@@ -2308,7 +2350,7 @@ Oct. 16, 2018 - Version 11.14
2308
2350
 
2309
2351
  Oct. 9, 2018 - Version 11.13
2310
2352
 
2311
- - Decode GPS from NextBase 512G dashcam MOV videos (different than 512GW)
2353
+ - Decode GPS from Nextbase 512G dashcam MOV videos (different than 512GW)
2312
2354
  - Added a new Canon LensType (thanks LibRaw)
2313
2355
  - Minor improvements to verbose dump of streaming GPS metadata
2314
2356
  - Reverted change of version 10.71 which resulted in Windows not recognizing
@@ -2327,7 +2369,7 @@ Oct. 2, 2018 - Version 11.12
2327
2369
  - Added a new Sony/Minolta LensType (thanks LibRaw and Jos Roost)
2328
2370
  - Added a new Nikon LensID
2329
2371
  - Decode a few new Sony SRF2 tags (thanks LibRaw)
2330
- - Decode GPS from NextBase 512GW dashcam MOV videos
2372
+ - Decode GPS from Nextbase 512GW dashcam MOV videos
2331
2373
  - Validate MS-DOC FIB before extracting contained tags
2332
2374
  - Fixed bug extracting GPSSpeed for some dashcam models
2333
2375
 
package/bin/MANIFEST CHANGED
@@ -294,6 +294,8 @@ lib/Image/ExifTool/GIF.pm
294
294
  lib/Image/ExifTool/GIMP.pm
295
295
  lib/Image/ExifTool/GPS.pm
296
296
  lib/Image/ExifTool/GeoTiff.pm
297
+ lib/Image/ExifTool/Geolocation.dat
298
+ lib/Image/ExifTool/Geolocation.pm
297
299
  lib/Image/ExifTool/Geotag.pm
298
300
  lib/Image/ExifTool/GoPro.pm
299
301
  lib/Image/ExifTool/H264.pm
@@ -543,6 +545,7 @@ t/ExifTool_32.out
543
545
  t/ExifTool_33.out
544
546
  t/ExifTool_34.out
545
547
  t/ExifTool_35.out
548
+ t/ExifTool_36.out
546
549
  t/ExifTool_4.out
547
550
  t/ExifTool_5.out
548
551
  t/ExifTool_6.out
@@ -920,6 +923,7 @@ t/Writer_58.out
920
923
  t/Writer_59.out
921
924
  t/Writer_6.out
922
925
  t/Writer_60.out
926
+ t/Writer_61.out
923
927
  t/Writer_7.out
924
928
  t/Writer_9.out
925
929
  t/XISF.t
package/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.76"
53
+ "version" : "12.78"
54
54
  }
package/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: 0
32
32
  requires:
33
33
  perl: 5.004
34
- version: 12.76
34
+ version: 12.78
package/bin/README CHANGED
@@ -20,7 +20,7 @@ supported by ExifTool (r = read, w = write, c = create):
20
20
  3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
21
21
  7Z r | DV r | JPEG r/w | OFR r | RWZ r
22
22
  A r | DVB r/w | JSON r | OGG r | RM r
23
- AA r | DVR-MS r | JXL r | OGV r | SEQ r
23
+ AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
24
24
  AAC r | DYLIB r | K25 r | ONP r | SKETCH r
25
25
  AAE r | EIP r | KDC r | OPUS r | SO r
26
26
  AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-12.76.tar.gz | tar -xf -
113
- cd Image-ExifTool-12.76
112
+ gzip -dc Image-ExifTool-12.78.tar.gz | tar -xf -
113
+ cd Image-ExifTool-12.78
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
@@ -6,7 +6,8 @@
6
6
  # Notes: This example file shows how to define your own shortcuts and
7
7
  # add new EXIF, IPTC, XMP, PNG, MIE and Composite tags, as well
8
8
  # as how to specify preferred lenses for the LensID tag, and
9
- # define new file types and default ExifTool option values.
9
+ # define new file types and default ExifTool API options and
10
+ # command-line arguments.
10
11
  #
11
12
  # Note that unknown tags may be extracted even if they aren't
12
13
  # defined, but tags must be defined to be written. Also note
@@ -345,7 +346,7 @@ use Image::ExifTool::MIE;
345
346
  use Image::ExifTool::QuickTime;
346
347
  $Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;
347
348
 
348
- # Specify default ExifTool option values
349
+ # Specify default ExifTool API options
349
350
  # (see the Options function documentation for available options)
350
351
  %Image::ExifTool::UserDefined::Options = (
351
352
  CoordFormat => '%.6f', # change default GPS coordinate format
@@ -354,5 +355,12 @@ $Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;
354
355
  RequestAll => 3, # request additional tags not normally generated
355
356
  );
356
357
 
358
+ # Specify default exiftool command-line arguments
359
+ # - inserted before all other options except -config
360
+ # - applies to all -execute'd commands
361
+ @Image::ExifTool::UserDefined::Arguments = (
362
+ '-i', 'HIDDEN', # ignore hidden files by default (names beginning with ".")
363
+ );
364
+
357
365
  #------------------------------------------------------------------------------
358
366
  1; #end
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.76';
14
+ my $version = '12.78';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -166,6 +166,7 @@ my $filtered; # flag indicating file was filtered by name
166
166
  my $filterFlag; # file filter flag (0x01=deny extensions, 0x02=allow extensions, 0x04=add ext)
167
167
  my $fixLen; # flag to fix description lengths when writing alternate languages
168
168
  my $forcePrint; # string to use for missing tag values (undef to not print them)
169
+ my $geoOnly; # flag to extract Geolocation tags only
169
170
  my $helped; # flag to avoid printing help if no tags specified
170
171
  my $html; # flag for html-formatted output (2=html dump)
171
172
  my $interrupted; # flag set if CTRL-C is pressed during a critical process
@@ -490,6 +491,7 @@ undef $fileHeader;
490
491
  undef $filtered;
491
492
  undef $fixLen;
492
493
  undef $forcePrint;
494
+ undef $geoOnly;
493
495
  undef $ignoreHidden;
494
496
  undef $joinLists;
495
497
  undef $langOpt;
@@ -587,6 +589,11 @@ if (not $preserveTime and $^O eq 'MSWin32') {
587
589
  $preserveTime = 2 if eval { require Win32::API } and eval { require Win32API::File };
588
590
  }
589
591
 
592
+ # add user-defined command-line arguments
593
+ if (@Image::ExifTool::UserDefined::Arguments) {
594
+ unshift @ARGV, @Image::ExifTool::UserDefined::Arguments;
595
+ }
596
+
590
597
  # parse command-line options in 2 passes...
591
598
  # pass 1: set all of our ExifTool options
592
599
  # pass 2: print all of our help and informational output (-list, -ver, etc)
@@ -1414,6 +1421,13 @@ if ($useMWG and not defined $mt->Options('CharsetEXIF')) {
1414
1421
  $mt->Options(CharsetEXIF => 'UTF8');
1415
1422
  }
1416
1423
 
1424
+ # allow geolocation without input file if set to a position
1425
+ if (not @files and not $outOpt and not @newValues) {
1426
+ my $loc = $mt->Options('Geolocation');
1427
+ # use undocumented feature to input JSON file directly from command line
1428
+ $loc and $loc =~ /,/ and push(@files, qq(\@JSON:{})), $geoOnly = 1;
1429
+ }
1430
+
1417
1431
  # print help
1418
1432
  unless ((@tags and not $outOpt) or @files or @newValues) {
1419
1433
  if ($doGlob and $doGlob == 2) {
@@ -2113,6 +2127,11 @@ sub GetImageInfo($$)
2113
2127
  # can't make use of $info if verbose because we must reprocess
2114
2128
  # the file anyway to generate the verbose output
2115
2129
  undef $info if $verbose or defined $fastCondition;
2130
+ } elsif ($file =~ s/^(\@JSON:)(.*)/$1/) {
2131
+ # read JSON file from command line
2132
+ my $dat = $2;
2133
+ $info = $et->ImageInfo(\$dat, \@foundTags);
2134
+ if ($geoOnly) { /^Geolocation/ or delete $$info{$_} foreach keys %$info }
2116
2135
  }
2117
2136
  if (defined $deleteOrig) {
2118
2137
  Progress($vout, "======== $file") if defined $verbose;
@@ -2169,7 +2188,7 @@ sub GetImageInfo($$)
2169
2188
  }
2170
2189
 
2171
2190
  # extract information from this file
2172
- unless ($file eq '-' or $et->Exists($file)) {
2191
+ unless ($file eq '-' or $et->Exists($file) or $info) {
2173
2192
  Warn "Error: File not found - $file\n";
2174
2193
  FileNotFound($file);
2175
2194
  defined $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
@@ -2354,7 +2373,7 @@ sub GetImageInfo($$)
2354
2373
  # set delimiters for JSON or PHP output
2355
2374
  ($bra, $ket, $sep) = $json == 1 ? ('{','}',':') : ('Array(',')',' =>');
2356
2375
  print $fp ",\n" if $comma;
2357
- print $fp qq($bra\n "SourceFile"$sep ), EscapeJSON(MyConvertFileName($et,$file));
2376
+ print $fp qq($bra\n "SourceFile"$sep ), EscapeJSON(MyConvertFileName($et,$file),1);
2358
2377
  $comma = 1;
2359
2378
  $ind = (defined $showGroup and not $allGroup) ? ' ' : ' ';
2360
2379
  } elsif ($csv) {
@@ -3372,7 +3391,22 @@ sub FormatXML($$$)
3372
3391
  my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val;
3373
3392
  foreach (@keys) {
3374
3393
  # (some variable-namespace XML structure fields may have a different group)
3375
- my $tok = /:/ ? $_ : ($grp . ':' . $_);
3394
+ my ($ns, $tg) = ($grp, $_);
3395
+ if (/^(.*?):(.*)/) {
3396
+ if ($grp eq 'JSON') {
3397
+ $tg =~ tr/:/_/; # colons in JSON structure elements are not namespaces
3398
+ } else {
3399
+ ($ns, $tg) = ($1, $2);
3400
+ }
3401
+ }
3402
+ # validate XML attribute name
3403
+ my $name;
3404
+ foreach $name ($ns, $tg) {
3405
+ # make sure name is valid for XML
3406
+ $name =~ tr/-_A-Za-z0-9.//dc;
3407
+ $name = '_' . $name if $name !~ /^[_A-Za-z]/;
3408
+ }
3409
+ my $tok = $ns . ':' . $tg;
3376
3410
  $val2 .= "\n$ind <$tok" . FormatXML($$val{$_}, "$ind ", $grp) . "</$tok>";
3377
3411
  }
3378
3412
  $val = "$val2\n$ind";
@@ -3515,7 +3549,7 @@ sub PrintCSV()
3515
3549
  }
3516
3550
 
3517
3551
  #------------------------------------------------------------------------------
3518
- # Add tag groups from structure fields to a list
3552
+ # Add tag groups from structure fields to a list for xmlns
3519
3553
  # Inputs: 0) tag value, 1) parent group, 2) group hash ref, 3) group list ref
3520
3554
  sub AddGroups($$$$)
3521
3555
  {
@@ -3523,7 +3557,7 @@ sub AddGroups($$$$)
3523
3557
  my ($key, $val2);
3524
3558
  if (ref $val eq 'HASH') {
3525
3559
  foreach $key (sort keys %$val) {
3526
- if ($key =~ /(.*?):/ and not $$groupHash{$1}) {
3560
+ if ($key =~ /^(.*?):/ and not $$groupHash{$1} and $grp ne 'JSON') {
3527
3561
  $$groupHash{$1} = $grp;
3528
3562
  push @$groupList, $1;
3529
3563
  }
@@ -4655,7 +4689,7 @@ supported by ExifTool (r = read, w = write, c = create):
4655
4689
  3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
4656
4690
  7Z r | DV r | JPEG r/w | OFR r | RWZ r
4657
4691
  A r | DVB r/w | JSON r | OGG r | RM r
4658
- AA r | DVR-MS r | JXL r | OGV r | SEQ r
4692
+ AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
4659
4693
  AAC r | DYLIB r | K25 r | ONP r | SKETCH r
4660
4694
  AAE r | EIP r | KDC r | OPUS r | SO r
4661
4695
  AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
@@ -4824,7 +4858,7 @@ L<Advanced options|/Advanced options>
4824
4858
  -common_args Define common arguments
4825
4859
  -config CFGFILE Specify configuration file name
4826
4860
  -echo[NUM] TEXT Echo text to stdout or stderr
4827
- -efile[NUM][!] ERRFILE Save names of files with errors
4861
+ -efile[NUM][!] TXTFILE Save names of files with errors
4828
4862
  -execute[NUM] Execute multiple commands on one line
4829
4863
  -fileNUM ALTFILE Load tags from alternate file
4830
4864
  -list_dir List directories, not their contents
@@ -5216,8 +5250,9 @@ Notes:
5216
5250
  when copying tags using the B<-tagsFromFile> option.
5217
5251
 
5218
5252
  2) If the hemisphere is known, a reference direction (N, S, E or W) is
5219
- appended to each printed coordinate, but adding a C<+> to the format
5220
- specifier (eg. C<%+.6f>) prints a signed coordinate instead.
5253
+ appended to each printed coordinate, but adding a C<+> or C<-> to the format
5254
+ specifier (eg. C<%+.6f> or C<%-.6f>) prints a signed coordinate instead.
5255
+ (C<+> adds a leading "+" for positive coordinates, but C<-> does not.)
5221
5256
 
5222
5257
  3) This print formatting may be disabled with the B<-n> option to extract
5223
5258
  coordinates as signed decimal degrees.
@@ -5605,7 +5640,7 @@ with this command:
5605
5640
 
5606
5641
  produces output like this:
5607
5642
 
5608
- -- Generated by ExifTool 12.76 --
5643
+ -- Generated by ExifTool 12.78 --
5609
5644
  File: a.jpg - 2003:10:31 15:44:19
5610
5645
  (f/5.6, 1/60s, ISO 100)
5611
5646
  File: b.jpg - 2006:05:23 11:57:38
@@ -6596,15 +6631,15 @@ respectively) after processing is complete. For B<-echo3> and B<-echo4>,
6596
6631
  "${status}" may be used in the I<TEXT> string to represent the numerical
6597
6632
  exit status of the command (see L</EXIT STATUS>).
6598
6633
 
6599
- =item B<-efile>[I<NUM>][!] I<ERRFILE>
6634
+ =item B<-efile>[I<NUM>][!] I<TXTFILE>
6600
6635
 
6601
6636
  Save the names of files giving errors (I<NUM> missing or 1), files that were
6602
6637
  unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4),
6603
6638
  files that were updated (I<NUM> is 8), files that were created (I<NUM> is
6604
6639
  16), or any combination thereof by summing I<NUM> (eg. B<-efile3> is the
6605
6640
  same has having both B<-efile> and B<-efile2> options with the same
6606
- I<ERRFILE>). By default, file names are appended to any existing I<ERRFILE>,
6607
- but I<ERRFILE> is overwritten if an exclamation point is added to the option
6641
+ I<TXTFILE>). By default, file names are appended to any existing I<TXTFILE>,
6642
+ but I<TXTFILE> is overwritten if an exclamation point is added to the option
6608
6643
  (eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile>
6609
6644
  option if applicable.
6610
6645
 
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.73';
91
+ $VERSION = '4.74';
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)
@@ -203,7 +203,8 @@ $VERSION = '4.73';
203
203
  52 => 'Canon EF-S 18-55mm f/3.5-5.6 IS II', #PH
204
204
  53 => 'Canon EF-S 18-55mm f/3.5-5.6 III', #Jon Charnas
205
205
  54 => 'Canon EF-S 55-250mm f/4-5.6 IS II', #47
206
- 60 => 'Irix 11mm f/4', #50
206
+ 60 => 'Irix 11mm f/4 or 15mm f/2.4', #50
207
+ 60.1 => 'Irix 15mm f/2.4', #forum15655
207
208
  63 => 'Irix 30mm F1.4 Dragonfly', #IB
208
209
  80 => 'Canon TS-E 50mm f/2.8L Macro', #42
209
210
  81 => 'Canon TS-E 90mm f/2.8L Macro', #42
@@ -4731,6 +4732,7 @@ my %ciMaxFocal = (
4731
4732
  NOTES => 'CameraInfo tags for the PowerShot G5 X Mark II.',
4732
4733
  0x0293 => {
4733
4734
  Name => 'ShutterCount',
4735
+ Condition => '$$self{FileType} eq "JPEG"',
4734
4736
  Format => 'int32u',
4735
4737
  Notes => 'includes electronic + mechanical shutter',
4736
4738
  # - advances by 1 for each photo file, regardless of mechanical or electronic shutter
@@ -4738,26 +4740,27 @@ my %ciMaxFocal = (
4738
4740
  # - advances for time lapse video files
4739
4741
  # - creating a new directory or resetting the counter from the menu doesn't affect this shutter count
4740
4742
  },
4743
+ 0x0a95 => {
4744
+ Name => 'ShutterCount',
4745
+ Condition => '$$self{FileType} eq "CR3"',
4746
+ Format => 'int32u',
4747
+ Notes => 'includes electronic + mechanical shutter',
4748
+ },
4741
4749
  0x0b21 => {
4742
4750
  Name => 'DirectoryIndex',
4751
+ Condition => '$$self{FileType} eq "JPEG"',
4743
4752
  Groups => { 2 => 'Image' },
4744
4753
  Format => 'int32u',
4745
4754
  },
4746
4755
  0x0b2d => {
4747
4756
  Name => 'FileIndex',
4757
+ Condition => '$$self{FileType} eq "JPEG"',
4748
4758
  Format => 'int32u',
4749
4759
  Groups => { 2 => 'Image' },
4750
4760
  Format => 'int32u',
4751
4761
  ValueConv => '$val + 1',
4752
4762
  ValueConvInv => '$val - 1',
4753
4763
  },
4754
- #0x0b39 => {
4755
- # Name => 'DirectoryIndex',
4756
- # Groups => { 2 => 'Image' },
4757
- # Format => 'int32u',
4758
- # ValueConv => '$val - 1',
4759
- # ValueConvInv => '$val + 1',
4760
- #},
4761
4764
  );
4762
4765
 
4763
4766
  # Canon camera information for 70D (MakerNotes tag 0x0d) (ref PH)
@@ -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.37';
26
+ $VERSION = '1.38';
27
27
 
28
28
  sub ProcessCanonVRD($$;$);
29
29
  sub WriteCanonVRD($$;$);
@@ -51,6 +51,7 @@ my %vrdFormat = (
51
51
  8 => 'int32u',
52
52
  9 => 'int32s',
53
53
  13 => 'double',
54
+ 24 => 'int32s', # (rectangle coordinates)
54
55
  33 => 'int32u', # (array)
55
56
  38 => 'double', # (array)
56
57
  # 254 => 'undef', ?
@@ -1226,6 +1227,11 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
1226
1227
  # 0x20a08 - (unknown picture style settings)
1227
1228
  # 0x20a09 - Custom picture style settings
1228
1229
  # 0x20a20 - Fine Detail picture style settings
1230
+ 0x20b10 => 'DPRAWMicroadjustBackFront', #forum15660
1231
+ 0x20b12 => 'DPRAWMicroadjustStrength', #forum15660
1232
+ 0x20b20 => 'DPRAWBokehShift', #forum15660
1233
+ 0x20b21 => 'DPRAWBokehShiftArea', #PH
1234
+ 0x20b30 => 'DPRAWGhostingReductionArea', #forum15660
1229
1235
  0x30101 => {
1230
1236
  Name => 'CropAspectRatio',
1231
1237
  PrintConv => {
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
57
57
  use Image::ExifTool qw(:DataAccess :Utils);
58
58
  use Image::ExifTool::MakerNotes;
59
59
 
60
- $VERSION = '4.50';
60
+ $VERSION = '4.51';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -593,6 +593,14 @@ my %opcodeInfo = (
593
593
  OffsetPair => 0x117, # point to associated byte counts
594
594
  DataTag => 'OtherImage',
595
595
  },
596
+ {
597
+ Condition => '$$self{Compression} and $$self{Compression} eq "52546"', # DNG 1.7 Jpeg XL
598
+ Name => 'PreviewJXLStart',
599
+ IsOffset => 1,
600
+ IsImageData => 1,
601
+ OffsetPair => 0x117, # point to associated byte counts
602
+ DataTag => 'PreviewJXL',
603
+ },
596
604
  {
597
605
  # (APP1 IFD2 is for Leica JPEG preview)
598
606
  Condition => q[
@@ -687,6 +695,12 @@ my %opcodeInfo = (
687
695
  OffsetPair => 0x111, # point to associated offset
688
696
  DataTag => 'OtherImage',
689
697
  },
698
+ {
699
+ Condition => '$$self{Compression} and $$self{Compression} eq "52546"', # DNG 1.7 Jpeg XL
700
+ Name => 'PreviewJXLLength',
701
+ OffsetPair => 0x111, # point to associated offset
702
+ DataTag => 'PreviewJXL',
703
+ },
690
704
  {
691
705
  # (APP1 IFD2 is for Leica JPEG preview)
692
706
  Condition => q[
@@ -2421,7 +2435,7 @@ my %opcodeInfo = (
2421
2435
  Count => -1, # 2, 3 or 4 values
2422
2436
  },
2423
2437
  0x9215 => 'ExposureIndex', #12
2424
- 0x9216 => 'TIFF-EPStandardID', #12
2438
+ 0x9216 => { Name => 'TIFF-EPStandardID', PrintConv => '$val =~ tr/ /./; $val' }, #12
2425
2439
  0x9217 => { #12
2426
2440
  Name => 'SensingMethod',
2427
2441
  Groups => { 2 => 'Camera' },
@@ -2711,7 +2725,7 @@ my %opcodeInfo = (
2711
2725
  Count => 2,
2712
2726
  },
2713
2727
  0xa215 => { Name => 'ExposureIndex', Writable => 'rational64u' },
2714
- 0xa216 => 'TIFF-EPStandardID',
2728
+ 0xa216 => { Name => 'TIFF-EPStandardID', PrintConv => '$val =~ tr/ /./; $val' },
2715
2729
  0xa217 => {
2716
2730
  Name => 'SensingMethod',
2717
2731
  Groups => { 2 => 'Camera' },
@@ -4971,6 +4985,39 @@ my %subSecConv = (
4971
4985
  Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"OtherImage");
4972
4986
  },
4973
4987
  },
4988
+ PreviewJXL => {
4989
+ Groups => { 0 => 'EXIF', 1 => 'SubIFD', 2 => 'Preview' },
4990
+ Require => {
4991
+ 0 => 'PreviewJXLStart',
4992
+ 1 => 'PreviewJXLLength',
4993
+ },
4994
+ Desire => {
4995
+ 2 => 'PreviewJXLStart (1)',
4996
+ 3 => 'PreviewJXLLength (1)',
4997
+ },
4998
+ # retrieve all other JXL images
4999
+ RawConv => q{
5000
+ if ($val[2] and $val[3]) {
5001
+ my $i = 1;
5002
+ for (;;) {
5003
+ my %val = ( 0 => $$val{2}, 1 => $$val{3} );
5004
+ $self->FoundTag($tagInfo, \%val);
5005
+ ++$i;
5006
+ $$val{2} = "$$val{0} ($i)";
5007
+ last unless defined $$self{VALUE}{$$val{2}};
5008
+ $$val{3} = "$$val{1} ($i)";
5009
+ last unless defined $$self{VALUE}{$$val{3}};
5010
+ }
5011
+ }
5012
+ @grps = $self->GetGroup($$val{0});
5013
+ my $image = $self->ExtractBinary($val[0], $val[1], 'PreviewJXL');
5014
+ unless ($image =~ /^(Binary data|\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl )/s) {
5015
+ $self->Warn("$tag is not a valid JXL image",1);
5016
+ return undef;
5017
+ }
5018
+ return \$image;
5019
+ },
5020
+ },
4974
5021
  PreviewImageSize => {
4975
5022
  Require => {
4976
5023
  0 => 'PreviewImageWidth',
@@ -5096,7 +5143,8 @@ my %subSecConv = (
5096
5143
  GPSLongitudeRef => '(defined $val and $val =~ / (-?)/) ? ($1 ? "W" : "E") : undef',
5097
5144
  },
5098
5145
  PrintConvInv => q{
5099
- return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
5146
+ return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/ or
5147
+ $val =~ /^\s*(-?\d+(?:\.\d+)?)\s*(-?\d+(?:\.\d+)?)\s*$/;
5100
5148
  my ($lat, $lon) = ($1, $2);
5101
5149
  require Image::ExifTool::GPS;
5102
5150
  $lat = Image::ExifTool::GPS::ToDegrees($lat, 1, "lat");
@@ -12,7 +12,7 @@ use strict;
12
12
  use vars qw($VERSION);
13
13
  use Image::ExifTool::Exif;
14
14
 
15
- $VERSION = '1.55';
15
+ $VERSION = '1.56';
16
16
 
17
17
  my %coordConv = (
18
18
  ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
@@ -491,7 +491,7 @@ sub PrintTimeStamp($)
491
491
  sub ToDMS($$;$$)
492
492
  {
493
493
  my ($et, $val, $doPrintConv, $ref) = @_;
494
- my ($fmt, @fmt, $num, $sign, $rtnVal, $neg);
494
+ my ($fmt, @fmt, $num, $sign, $minus, $rtnVal, $neg);
495
495
 
496
496
  unless (length $val) {
497
497
  # don't convert an empty value
@@ -503,8 +503,10 @@ sub ToDMS($$;$$)
503
503
  $val = -$val;
504
504
  $ref = {N => 'S', E => 'W'}->{$ref};
505
505
  $sign = '-';
506
+ $minus = '-';
506
507
  } else {
507
508
  $sign = '+';
509
+ $minus = '';
508
510
  }
509
511
  $ref = " $ref" unless $doPrintConv and $doPrintConv eq '2';
510
512
  } else {
@@ -522,7 +524,7 @@ sub ToDMS($$;$$)
522
524
  $fmt = q{%d deg %d' %.2f"} . $ref;
523
525
  } elsif ($ref) {
524
526
  # use signed value instead of reference direction if specified
525
- $fmt =~ s/%\+/$sign%/g or $fmt .= $ref;
527
+ $fmt =~ s/%\+/$sign%/g or $fmt =~ s/%-/$minus%/g or $fmt .= $ref;
526
528
  } else {
527
529
  $fmt =~ s/%\+/%/g; # don't know sign, so don't print it
528
530
  }