exiftool-vendored.exe 13.31.0 → 13.34.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 (38) hide show
  1. package/bin/exiftool.exe +0 -0
  2. package/bin/exiftool_files/exiftool.pl +30 -10
  3. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +7 -5
  4. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +19 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +9 -6
  6. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +4 -159
  7. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +11 -3
  8. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +5 -3
  9. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +14 -2
  10. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +4 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/Lang/cs.pm +0 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/Lang/de.pm +0 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fr.pm +0 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/Lang/it.pm +0 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ja.pm +0 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +0 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/Lang/pl.pm +0 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1
  19. package/bin/exiftool_files/lib/Image/ExifTool/Microsoft.pm +158 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +4 -2
  21. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +72 -37
  22. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +40 -10
  23. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +254 -34
  24. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +3 -3
  25. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +340 -61
  26. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +11 -4
  27. package/bin/exiftool_files/lib/Image/ExifTool/README +2 -1
  28. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +44 -17
  29. package/bin/exiftool_files/lib/Image/ExifTool/TNEF.pm +487 -0
  30. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4380 -4265
  31. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +265 -19
  32. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +14 -12
  33. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +19 -15
  34. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +1 -1
  35. package/bin/exiftool_files/lib/Image/ExifTool.pm +12 -4
  36. package/bin/exiftool_files/lib/Image/ExifTool.pod +50 -44
  37. package/bin/exiftool_files/windows_exiftool.txt +89 -84
  38. package/package.json +7 -6
package/bin/exiftool.exe CHANGED
Binary file
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.31';
14
+ my $version = '13.34';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -93,9 +93,9 @@ my @csvFiles; # list of files when reading with CSV option (in ExifTool Ch
93
93
  my @csvTags; # order of tags for first file with CSV option (lower case)
94
94
  my @delFiles; # list of files to delete
95
95
  my @dynamicFiles; # list of -tagsFromFile files with dynamic names and -TAG<=FMT pairs
96
+ my (@echo3, @echo4);# stdout and stderr echo after processing is complete
96
97
  my @efile; # files for writing list of error/fail/same file names
97
98
  my @exclude; # list of excluded tags
98
- my (@echo3, @echo4);# stdout and stderr echo after processing is complete
99
99
  my @files; # list of files and directories to scan
100
100
  my @moreArgs; # more arguments to process after -stay_open -@
101
101
  my @newValues; # list of new tag values to set
@@ -110,7 +110,6 @@ my %csvTags; # lookup for all found tags with CSV option (lower case keys
110
110
  my %database; # lookup for database information based on file name (in ExifTool Charset)
111
111
  my %filterExt; # lookup for filtered extensions
112
112
  my %ignore; # directory names to ignore
113
- my $ignoreHidden; # flag to ignore hidden files
114
113
  my %outComma; # flag that output text file needs a comma
115
114
  my %outTrailer; # trailer for output text file
116
115
  my %preserveTime; # preserved timestamps for files
@@ -122,6 +121,7 @@ my %usedFileName; # lookup for file names we already used in TestName feature
122
121
  my %utf8FileName; # lookup for file names that are UTF-8 encoded
123
122
  my %warnedOnce; # lookup for once-only warnings
124
123
  my %wext; # -W extensions to write
124
+ my %wroteHEAD; # list of output txt files to which we wrote HEAD
125
125
  my $allGroup; # show group name for all tags
126
126
  my $altEnc; # alternate character encoding if not UTF-8
127
127
  my $argFormat; # use exiftool argument-format output
@@ -167,6 +167,7 @@ my $forcePrint; # string to use for missing tag values (undef to not print t
167
167
  my $geoOnly; # flag to extract Geolocation tags only
168
168
  my $helped; # flag to avoid printing help if no tags specified
169
169
  my $html; # flag for html-formatted output (2=html dump)
170
+ my $ignoreHidden; # flag to ignore hidden files
170
171
  my $interrupted; # flag set if CTRL-C is pressed during a critical process
171
172
  my $isBinary; # true if value is a SCALAR ref
172
173
  my $isWriting; # flag set if we are writing tags
@@ -219,7 +220,6 @@ my $validFile; # flag indicating we processed a valid file
219
220
  my $verbose; # verbose setting
220
221
  my $vout; # verbose output file reference (\*STDOUT or \*STDERR by default)
221
222
  my $windowTitle; # title for console window
222
- my %wroteHEAD; # list of output txt files to which we wrote HEAD
223
223
  my $xml; # flag for XML-formatted output
224
224
 
225
225
  # flag to keep the input -@ argfile open:
@@ -464,8 +464,10 @@ undef @efile;
464
464
  undef @exclude;
465
465
  undef @files;
466
466
  undef @newValues;
467
+ undef @requestTags;
467
468
  undef @srcFmt;
468
469
  undef @tags;
470
+ undef %altFile;
469
471
  undef %appended;
470
472
  undef %countLink;
471
473
  undef %created;
@@ -485,6 +487,7 @@ undef %usedFileName;
485
487
  undef %utf8FileName;
486
488
  undef %warnedOnce;
487
489
  undef %wext;
490
+ undef %wroteHEAD;
488
491
  undef $allGroup;
489
492
  undef $altEnc;
490
493
  undef $argFormat;
@@ -501,8 +504,8 @@ undef $doSetFileName;
501
504
  undef $doUnzip;
502
505
  undef $end;
503
506
  undef $endDir;
504
- undef $escapeHTML;
505
507
  undef $escapeC;
508
+ undef $escapeHTML;
506
509
  undef $evalWarning;
507
510
  undef $executeID;
508
511
  undef $failCondition;
@@ -513,18 +516,22 @@ undef $fixLen;
513
516
  undef $forcePrint;
514
517
  undef $geoOnly;
515
518
  undef $ignoreHidden;
519
+ undef $isBinary;
516
520
  undef $joinLists;
517
521
  undef $langOpt;
522
+ undef $listDir;
518
523
  undef $listItem;
519
524
  undef $multiFile;
520
525
  undef $noBinary;
521
526
  undef $outOpt;
527
+ undef $plot;
522
528
  undef $preserveTime;
523
529
  undef $progress;
524
530
  undef $progressCount;
525
531
  undef $progressIncr;
526
532
  undef $progressMax;
527
533
  undef $progressNext;
534
+ undef $rafStdin;
528
535
  undef $recurse;
529
536
  undef $scanWritable;
530
537
  undef $sectHeader;
@@ -534,6 +541,7 @@ undef $showTagID;
534
541
  undef $structOpt;
535
542
  undef $tagOut;
536
543
  undef $textOut;
544
+ undef $textOut2;
537
545
  undef $textOverwrite;
538
546
  undef $tmpFile;
539
547
  undef $tmpText;
@@ -1483,8 +1491,7 @@ if (not @files and not $outOpt and not @newValues) {
1483
1491
  # print help
1484
1492
  unless ((@tags and not $outOpt) or @files or @newValues or $geoOnly) {
1485
1493
  if ($doGlob and $doGlob == 2) {
1486
- Warn "No matching files\n";
1487
- $rtnVal = 1;
1494
+ Error "No matching files\n";
1488
1495
  next;
1489
1496
  }
1490
1497
  if ($outOpt) {
@@ -2531,7 +2538,7 @@ T2: foreach $t2 (@tags2) {
2531
2538
  # print the results for this file
2532
2539
  if (%printFmt) {
2533
2540
  # output using print format file (-p) option
2534
- my ($type, $doc, $grp, $lastDoc, $cache);
2541
+ my ($type, @doc, $grp, $lastDoc, $cache);
2535
2542
  $fileTrailer = '';
2536
2543
  # repeat for each embedded document if necessary (only if -ee used)
2537
2544
  if ($et->Options('ExtractEmbedded')) {
@@ -2540,7 +2547,8 @@ T2: foreach $t2 (@tags2) {
2540
2547
  } else {
2541
2548
  $lastDoc = 0;
2542
2549
  }
2543
- for ($doc=0; $doc<=$lastDoc; ++$doc) {
2550
+ for ($doc[0]=0; $doc[0]<=$lastDoc; ) {
2551
+ my $doc = join '-', @doc;
2544
2552
  my ($skipBody, $opt);
2545
2553
  foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
2546
2554
  my $prf = $printFmt{$type} or next;
@@ -2550,7 +2558,7 @@ T2: foreach $t2 (@tags2) {
2550
2558
  }
2551
2559
  next if $type eq 'BODY' and $skipBody;
2552
2560
  # silence "IF" warnings and warnings for subdocuments > 1
2553
- if ($type eq 'IF' or ($doc > 1 and not $$et{OPTIONS}{IgnoreMinorErrors})) {
2561
+ if ($type eq 'IF' or (($doc[0] > 1 or @doc > 1) and not $$et{OPTIONS}{IgnoreMinorErrors})) {
2554
2562
  $opt = 'Silent';
2555
2563
  } else {
2556
2564
  $opt = 'Warn';
@@ -2589,6 +2597,14 @@ T2: foreach $t2 (@tags2) {
2589
2597
  print $fp @lines;
2590
2598
  }
2591
2599
  }
2600
+ # find next available doc-subdoc
2601
+ push @doc, 1;
2602
+ while (@doc > 1) {
2603
+ my $nextDoc = join '-', @doc;
2604
+ last if $$et{HAS_DOC}{$nextDoc};
2605
+ pop @doc;
2606
+ ++$doc[-1];
2607
+ }
2592
2608
  }
2593
2609
  delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
2594
2610
  my $errs = $et->GetInfo('Warning', 'Error');
@@ -4520,6 +4536,10 @@ sub SuggestedExtension($$$)
4520
4536
  } elsif ($$valPt =~ /^.{4}ftyp(3gp|mp4|f4v|qt )/s) {
4521
4537
  my %movType = ( 'qt ' => 'mov' );
4522
4538
  $ext = $movType{$1} || $1;
4539
+ } elsif ($$valPt =~ /^<(!DOCTYPE )?html/i) {
4540
+ $ext = 'html';
4541
+ } elsif ($$valPt =~ /^[\n\r]*\{[\n\r]*\\rtf/) {
4542
+ $ext = 'rtf';
4523
4543
  } elsif ($$valPt !~ /^.{0,4096}\0/s) {
4524
4544
  $ext = 'txt';
4525
4545
  } elsif ($$valPt =~ /^BM.{15}\0/s) {
@@ -271,11 +271,11 @@ tags remain.
271
271
 
272
272
  The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and
273
273
  other tags which are not part of the EXIF specification, but may co-exist
274
- with EXIF tags in some images. Tags which are part of the EXIF 2.32
274
+ with EXIF tags in some images. Tags which are part of the EXIF 3.0
275
275
  specification have an underlined B<Tag Name> in the HTML version of this
276
276
  documentation. See
277
- L<https://web.archive.org/web/20190624045241if_/http://www.cipa.jp:80/std/documents/e/DC-008-Translation-2019-E.pdf>
278
- for the official EXIF 2.32 specification.
277
+ L<https://www.cipa.jp/std/documents/download_e.html?CIPA_DC-008-2024-E>
278
+ for the official EXIF 3.0 specification.
279
279
  },
280
280
  GPS => q{
281
281
  These GPS tags are part of the EXIF standard, and are stored in a separate
@@ -2338,7 +2338,8 @@ sub WriteTagNames($$)
2338
2338
  my ($hid, $showGrp);
2339
2339
  # widths of the different columns in the POD documentation
2340
2340
  my ($wID,$wTag,$wReq,$wGrp) = (8,36,24,10);
2341
- my ($composite, $derived, $notes, $longTags, $wasLong, $prefix);
2341
+ my ($composite, $derived, $notes, $longTags, $prefix);
2342
+ my $wasLong = 0;
2342
2343
  if ($short eq 'Shortcuts') {
2343
2344
  $derived = '<th>Refers To</th>';
2344
2345
  $composite = 2;
@@ -2396,7 +2397,7 @@ sub WriteTagNames($$)
2396
2397
  $wID -= $longTag - $wTag;
2397
2398
  $wTag = $longTag;
2398
2399
  }
2399
- $wasLong = 1 if $wID <= $self->{LONG_ID}->{$tableName};
2400
+ ++$wasLong if $wID <= $self->{LONG_ID}->{$tableName};
2400
2401
  }
2401
2402
  } elsif ($composite) {
2402
2403
  $wTag += $wID - $wReq;
@@ -2471,6 +2472,7 @@ sub WriteTagNames($$)
2471
2472
  if ($over <= $wTag - length($$tagNames[0])) {
2472
2473
  $wTag2 -= $over;
2473
2474
  $w += $over;
2475
+ --$wasLong;
2474
2476
  } else {
2475
2477
  # put tag name on next line if ID is too long
2476
2478
  $idStr = " $tagIDstr\n " . (' ' x $w);
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.92';
91
+ $VERSION = '4.95';
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)
@@ -2151,6 +2151,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2151
2151
  TagTable => 'Image::ExifTool::Canon::RawBurstInfo',
2152
2152
  }
2153
2153
  },
2154
+ # 0x4049 - related to croping (forum13491) - "8 0 0 0" = no crop, "8 1 0 1" = crop enabled
2154
2155
  0x4059 => { #forum16111
2155
2156
  Name => 'LevelInfo',
2156
2157
  SubDirectory => {
@@ -2621,6 +2622,10 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2621
2622
  # 47 - related to aspect ratio: 100=4:3,70=1:1/16:9,90=3:2,60=4:5 (PH G12)
2622
2623
  # (roughly image area in percent - 4:3=100%,1:1/16:9=75%,3:2=89%,4:5=60%)
2623
2624
  # 48 - 3 for CR2/CR3, 4 or 7 for JPG, -1 for edited JPG (see forum16127)
2625
+ 50 => { #github340
2626
+ Name => 'FocusBracketing',
2627
+ PrintConv => { 0 => 'Disable', 1 => 'Enable' },
2628
+ },
2624
2629
  51 => { #forum16036 (EOS R models)
2625
2630
  Name => 'Clarity',
2626
2631
  PrintConv => {
@@ -2628,6 +2633,10 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2628
2633
  0x7fff => 'n/a',
2629
2634
  },
2630
2635
  },
2636
+ 52 => { #github336
2637
+ Name => 'HDR-PQ',
2638
+ PrintConv => { %offOn, -1 => 'n/a' },
2639
+ },
2631
2640
  );
2632
2641
 
2633
2642
  # focal length information (MakerNotes tag 0x02)
@@ -8931,7 +8940,7 @@ my %ciMaxFocal = (
8931
8940
  },
8932
8941
  3 => {
8933
8942
  Name => 'HighlightTonePriority',
8934
- PrintConv => \%offOn,
8943
+ PrintConv => { %offOn, 2 => 'Enhanced' }, #github339 (Enhanced)
8935
8944
  },
8936
8945
  4 => {
8937
8946
  Name => 'LongExposureNoiseReduction',
@@ -9323,6 +9332,14 @@ my %filterConv = (
9323
9332
  3 => 'Vehicles',
9324
9333
  },
9325
9334
  },
9335
+ 21 => { #github344 (R6)
9336
+ Name => 'SubjectSwitching',
9337
+ PrintConv => {
9338
+ 0 => 'Initial Priority',
9339
+ 1 => 'On Subject',
9340
+ 2 => 'Switch Subject',
9341
+ },
9342
+ },
9326
9343
  24 => { #forum16068
9327
9344
  Name => 'EyeDetection',
9328
9345
  PrintConv => \%offOn,
@@ -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.58';
60
+ $VERSION = '4.60';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -402,7 +402,7 @@ my %opcodeInfo = (
402
402
  THM => 'THM - DCF thumbnail file',
403
403
  },
404
404
  },
405
- 0x2 => { #5
405
+ 0x2 => { #5 (not in the EXIF spec)
406
406
  Name => 'InteropVersion',
407
407
  Description => 'Interoperability Version',
408
408
  Protected => 1,
@@ -2029,7 +2029,7 @@ my %opcodeInfo = (
2029
2029
  OffsetPair => -1,
2030
2030
  },
2031
2031
  0x8782 => 'T88Options', #20
2032
- 0x87ac => 'ImageLayer',
2032
+ 0x87ac => 'ImageLayer', # Defined in the Mixed Raster Content part of RFC 2301
2033
2033
  0x87af => { #30
2034
2034
  Name => 'GeoTiffDirectory',
2035
2035
  Format => 'undef',
@@ -4209,6 +4209,8 @@ my %opcodeInfo = (
4209
4209
  },
4210
4210
  },
4211
4211
  # 0xc7d6 - int8u: 1 (SubIFD1 of Nikon Z6/Z7 NEF)
4212
+ 0xc7d7 => { Name => 'ZIFMetadata', Binary => 1 },
4213
+ 0xc7d8 => { Name => 'ZIFAnnotations', Binary => 1 },
4212
4214
  0xc7e9 => { # DNG 1.5
4213
4215
  Name => 'DepthFormat',
4214
4216
  Writable => 'int16u',
@@ -6360,9 +6362,10 @@ sub ProcessExif($$$)
6360
6362
  $et->Warn("Bad format ($format) for $dir entry $index", $inMakerNotes);
6361
6363
  ++$warnCount;
6362
6364
  }
6363
- # assume corrupted IFD if this is our first entry (except Sony ILCE-7M2 firmware 1.21)
6364
- return 0 unless $index or $$et{Model} eq 'ILCE-7M2';
6365
- next;
6365
+ # assume corrupted IFD if this is our first entry (except Sony ILCE which have an empty first entry)
6366
+ next if $index or $$et{Model} =~ /^ILCE/;
6367
+ # $et->Warn(sprintf('Format code 0x%x encountered -- Possibly corrupted IFD'));
6368
+ return 0;
6366
6369
  }
6367
6370
  }
6368
6371
  my $formatStr = $formatName[$format]; # get name of this format
@@ -21,8 +21,9 @@ use vars qw($VERSION);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
  use Image::ExifTool::Exif;
23
23
  use Image::ExifTool::ASF; # for GetGUID()
24
+ use Image::ExifTool::Microsoft; # for %codePage
24
25
 
25
- $VERSION = '1.49';
26
+ $VERSION = '1.50';
26
27
 
27
28
  sub ProcessFPX($$);
28
29
  sub ProcessFPXR($$$);
@@ -123,163 +124,6 @@ my %oleFormatSize = (
123
124
  # names for each type of directory entry
124
125
  my @dirEntryType = qw(INVALID STORAGE STREAM LOCKBYTES PROPERTY ROOT);
125
126
 
126
- # list of code pages used by Microsoft
127
- # (ref http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx)
128
- my %codePage = (
129
- 37 => 'IBM EBCDIC US-Canada',
130
- 437 => 'DOS United States',
131
- 500 => 'IBM EBCDIC International',
132
- 708 => 'Arabic (ASMO 708)',
133
- 709 => 'Arabic (ASMO-449+, BCON V4)',
134
- 710 => 'Arabic - Transparent Arabic',
135
- 720 => 'DOS Arabic (Transparent ASMO)',
136
- 737 => 'DOS Greek (formerly 437G)',
137
- 775 => 'DOS Baltic',
138
- 850 => 'DOS Latin 1 (Western European)',
139
- 852 => 'DOS Latin 2 (Central European)',
140
- 855 => 'DOS Cyrillic (primarily Russian)',
141
- 857 => 'DOS Turkish',
142
- 858 => 'DOS Multilingual Latin 1 with Euro',
143
- 860 => 'DOS Portuguese',
144
- 861 => 'DOS Icelandic',
145
- 862 => 'DOS Hebrew',
146
- 863 => 'DOS French Canadian',
147
- 864 => 'DOS Arabic',
148
- 865 => 'DOS Nordic',
149
- 866 => 'DOS Russian (Cyrillic)',
150
- 869 => 'DOS Modern Greek',
151
- 870 => 'IBM EBCDIC Multilingual/ROECE (Latin 2)',
152
- 874 => 'Windows Thai (same as 28605, ISO 8859-15)',
153
- 875 => 'IBM EBCDIC Greek Modern',
154
- 932 => 'Windows Japanese (Shift-JIS)',
155
- 936 => 'Windows Simplified Chinese (PRC, Singapore)',
156
- 949 => 'Windows Korean (Unified Hangul Code)',
157
- 950 => 'Windows Traditional Chinese (Taiwan)',
158
- 1026 => 'IBM EBCDIC Turkish (Latin 5)',
159
- 1047 => 'IBM EBCDIC Latin 1/Open System',
160
- 1140 => 'IBM EBCDIC US-Canada with Euro',
161
- 1141 => 'IBM EBCDIC Germany with Euro',
162
- 1142 => 'IBM EBCDIC Denmark-Norway with Euro',
163
- 1143 => 'IBM EBCDIC Finland-Sweden with Euro',
164
- 1144 => 'IBM EBCDIC Italy with Euro',
165
- 1145 => 'IBM EBCDIC Latin America-Spain with Euro',
166
- 1146 => 'IBM EBCDIC United Kingdom with Euro',
167
- 1147 => 'IBM EBCDIC France with Euro',
168
- 1148 => 'IBM EBCDIC International with Euro',
169
- 1149 => 'IBM EBCDIC Icelandic with Euro',
170
- 1200 => 'Unicode UTF-16, little endian',
171
- 1201 => 'Unicode UTF-16, big endian',
172
- 1250 => 'Windows Latin 2 (Central European)',
173
- 1251 => 'Windows Cyrillic',
174
- 1252 => 'Windows Latin 1 (Western European)',
175
- 1253 => 'Windows Greek',
176
- 1254 => 'Windows Turkish',
177
- 1255 => 'Windows Hebrew',
178
- 1256 => 'Windows Arabic',
179
- 1257 => 'Windows Baltic',
180
- 1258 => 'Windows Vietnamese',
181
- 1361 => 'Korean (Johab)',
182
- 10000 => 'Mac Roman (Western European)',
183
- 10001 => 'Mac Japanese',
184
- 10002 => 'Mac Traditional Chinese',
185
- 10003 => 'Mac Korean',
186
- 10004 => 'Mac Arabic',
187
- 10005 => 'Mac Hebrew',
188
- 10006 => 'Mac Greek',
189
- 10007 => 'Mac Cyrillic',
190
- 10008 => 'Mac Simplified Chinese',
191
- 10010 => 'Mac Romanian',
192
- 10017 => 'Mac Ukrainian',
193
- 10021 => 'Mac Thai',
194
- 10029 => 'Mac Latin 2 (Central European)',
195
- 10079 => 'Mac Icelandic',
196
- 10081 => 'Mac Turkish',
197
- 10082 => 'Mac Croatian',
198
- 12000 => 'Unicode UTF-32, little endian',
199
- 12001 => 'Unicode UTF-32, big endian',
200
- 20000 => 'CNS Taiwan',
201
- 20001 => 'TCA Taiwan',
202
- 20002 => 'Eten Taiwan',
203
- 20003 => 'IBM5550 Taiwan',
204
- 20004 => 'TeleText Taiwan',
205
- 20005 => 'Wang Taiwan',
206
- 20105 => 'IA5 (IRV International Alphabet No. 5, 7-bit)',
207
- 20106 => 'IA5 German (7-bit)',
208
- 20107 => 'IA5 Swedish (7-bit)',
209
- 20108 => 'IA5 Norwegian (7-bit)',
210
- 20127 => 'US-ASCII (7-bit)',
211
- 20261 => 'T.61',
212
- 20269 => 'ISO 6937 Non-Spacing Accent',
213
- 20273 => 'IBM EBCDIC Germany',
214
- 20277 => 'IBM EBCDIC Denmark-Norway',
215
- 20278 => 'IBM EBCDIC Finland-Sweden',
216
- 20280 => 'IBM EBCDIC Italy',
217
- 20284 => 'IBM EBCDIC Latin America-Spain',
218
- 20285 => 'IBM EBCDIC United Kingdom',
219
- 20290 => 'IBM EBCDIC Japanese Katakana Extended',
220
- 20297 => 'IBM EBCDIC France',
221
- 20420 => 'IBM EBCDIC Arabic',
222
- 20423 => 'IBM EBCDIC Greek',
223
- 20424 => 'IBM EBCDIC Hebrew',
224
- 20833 => 'IBM EBCDIC Korean Extended',
225
- 20838 => 'IBM EBCDIC Thai',
226
- 20866 => 'Russian/Cyrillic (KOI8-R)',
227
- 20871 => 'IBM EBCDIC Icelandic',
228
- 20880 => 'IBM EBCDIC Cyrillic Russian',
229
- 20905 => 'IBM EBCDIC Turkish',
230
- 20924 => 'IBM EBCDIC Latin 1/Open System with Euro',
231
- 20932 => 'Japanese (JIS 0208-1990 and 0121-1990)',
232
- 20936 => 'Simplified Chinese (GB2312)',
233
- 20949 => 'Korean Wansung',
234
- 21025 => 'IBM EBCDIC Cyrillic Serbian-Bulgarian',
235
- 21027 => 'Extended Alpha Lowercase (deprecated)',
236
- 21866 => 'Ukrainian/Cyrillic (KOI8-U)',
237
- 28591 => 'ISO 8859-1 Latin 1 (Western European)',
238
- 28592 => 'ISO 8859-2 (Central European)',
239
- 28593 => 'ISO 8859-3 Latin 3',
240
- 28594 => 'ISO 8859-4 Baltic',
241
- 28595 => 'ISO 8859-5 Cyrillic',
242
- 28596 => 'ISO 8859-6 Arabic',
243
- 28597 => 'ISO 8859-7 Greek',
244
- 28598 => 'ISO 8859-8 Hebrew (Visual)',
245
- 28599 => 'ISO 8859-9 Turkish',
246
- 28603 => 'ISO 8859-13 Estonian',
247
- 28605 => 'ISO 8859-15 Latin 9',
248
- 29001 => 'Europa 3',
249
- 38598 => 'ISO 8859-8 Hebrew (Logical)',
250
- 50220 => 'ISO 2022 Japanese with no halfwidth Katakana (JIS)',
251
- 50221 => 'ISO 2022 Japanese with halfwidth Katakana (JIS-Allow 1 byte Kana)',
252
- 50222 => 'ISO 2022 Japanese JIS X 0201-1989 (JIS-Allow 1 byte Kana - SO/SI)',
253
- 50225 => 'ISO 2022 Korean',
254
- 50227 => 'ISO 2022 Simplified Chinese',
255
- 50229 => 'ISO 2022 Traditional Chinese',
256
- 50930 => 'EBCDIC Japanese (Katakana) Extended',
257
- 50931 => 'EBCDIC US-Canada and Japanese',
258
- 50933 => 'EBCDIC Korean Extended and Korean',
259
- 50935 => 'EBCDIC Simplified Chinese Extended and Simplified Chinese',
260
- 50936 => 'EBCDIC Simplified Chinese',
261
- 50937 => 'EBCDIC US-Canada and Traditional Chinese',
262
- 50939 => 'EBCDIC Japanese (Latin) Extended and Japanese',
263
- 51932 => 'EUC Japanese',
264
- 51936 => 'EUC Simplified Chinese',
265
- 51949 => 'EUC Korean',
266
- 51950 => 'EUC Traditional Chinese',
267
- 52936 => 'HZ-GB2312 Simplified Chinese',
268
- 54936 => 'Windows XP and later: GB18030 Simplified Chinese (4 byte)',
269
- 57002 => 'ISCII Devanagari',
270
- 57003 => 'ISCII Bengali',
271
- 57004 => 'ISCII Tamil',
272
- 57005 => 'ISCII Telugu',
273
- 57006 => 'ISCII Assamese',
274
- 57007 => 'ISCII Oriya',
275
- 57008 => 'ISCII Kannada',
276
- 57009 => 'ISCII Malayalam',
277
- 57010 => 'ISCII Gujarati',
278
- 57011 => 'ISCII Punjabi',
279
- 65000 => 'Unicode (UTF-7)',
280
- 65001 => 'Unicode (UTF-8)',
281
- );
282
-
283
127
  # test for file extensions which may be variants of the FPX format
284
128
  # (have seen one password-protected DOCX file that is FPX-like, so assume
285
129
  # that all the rest could be as well)
@@ -550,7 +394,8 @@ my %fpxFileType = (
550
394
  0x01 => {
551
395
  Name => 'CodePage',
552
396
  Groups => { 2 => 'Other' },
553
- PrintConv => \%codePage,
397
+ SeparateTable => 'Microsoft CodePage',
398
+ PrintConv => \%Image::ExifTool::Microsoft::codePage,
554
399
  },
555
400
  0x02 => 'Title',
556
401
  0x03 => 'Subject',
@@ -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.97';
34
+ $VERSION = '1.98';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -832,6 +832,13 @@ my %faceCategories = (
832
832
  },
833
833
  0x1447 => { Name => 'FujiModel', Writable => 'string' },
834
834
  0x1448 => { Name => 'FujiModel2', Writable => 'string' },
835
+
836
+ # Found in X-M5, X-E5
837
+ # White balance as shot. Same valus as 0xf00e.
838
+ 0x144a => { Name => 'WBRed', Writable => 'int16u' },
839
+ 0x144b => { Name => 'WBGreen', Writable => 'int16u' },
840
+ 0x144c => { Name => 'WBBlue', Writable => 'int16u' },
841
+
835
842
  0x144d => { Name => 'RollAngle', Writable => 'rational64s' }, #forum14319
836
843
  0x3803 => { #forum10037
837
844
  Name => 'VideoRecordingMode',
@@ -1564,7 +1571,7 @@ my %faceCategories = (
1564
1571
  6 => { Name => 'FNumber', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)' },
1565
1572
  # 7 - seen 200, 125, 250, 2000
1566
1573
  7 => 'ISO',
1567
- # 8 - seen 0
1574
+ # 8 - seen 0, 65536
1568
1575
  );
1569
1576
 
1570
1577
  #------------------------------------------------------------------------------
@@ -1673,7 +1680,7 @@ sub ProcessFujiDir($$$)
1673
1680
  #------------------------------------------------------------------------------
1674
1681
  # get information from FujiFilm M-RAW header
1675
1682
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
1676
- # Returns: 1 if this was a valid M-RAW headerx
1683
+ # Returns: 1 if this was a valid M-RAW header
1677
1684
  sub ProcessMRAW($$$)
1678
1685
  {
1679
1686
  my ($et, $dirInfo, $tagTablePtr) = @_;
@@ -1809,6 +1816,7 @@ sub WriteRAF($$)
1809
1816
  # make sure padding is only zero bytes (can be >100k for HS10)
1810
1817
  # (have seen non-null padding in X-Pro1)
1811
1818
  if ($buff =~ /[^\0]/) {
1819
+ HexDump(\$buff);
1812
1820
  return 1 if $et->Error('Non-null bytes found in padding', 2);
1813
1821
  }
1814
1822
  }
@@ -18,6 +18,8 @@
18
18
  # 2024/04/23 - PH Added ability to read more OpenTracks GPS tags
19
19
  # 2024/08/28 - PH Added support for new Google Takeout JSON format
20
20
  # 2024/11/26 - PH Also write GPSMeasureMode and GPSDOP
21
+ # 2024/11/05 - PH Added support for Google Maps "Export timeline data"
22
+ # JSON format
21
23
  #
22
24
  # References: 1) http://www.topografix.com/GPX/1/1/
23
25
  # 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
@@ -1545,9 +1547,9 @@ This module is used by Image::ExifTool
1545
1547
 
1546
1548
  This module loads GPS track logs, interpolates to determine position based
1547
1549
  on time, and sets new GPS values for geotagging images. Currently supported
1548
- formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan
1549
- PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus Beacon text, Google Takeout
1550
- JSON, GPS/IMU CSV, DJI CSV, ExifTool CSV log files.
1550
+ formats are GPX, NMEA RMC/GGA/GLL/GSA/ZDA, KML, IGC, Garmin XML and TCX,
1551
+ Magellan PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus Beacon text,
1552
+ GPS/IMU CSV, DJI CSV, ExifTool CSV and 3 different Google JSON formats.
1551
1553
 
1552
1554
  Methods in this module should not be called directly. Instead, the Geotag
1553
1555
  feature is accessed by writing the values of the ExifTool Geotag, Geosync
@@ -17,7 +17,7 @@ use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
  use Image::ExifTool::QuickTime;
19
19
 
20
- $VERSION = '1.13';
20
+ $VERSION = '1.14';
21
21
 
22
22
  sub ProcessGoPro($$$);
23
23
  sub ProcessString($$$);
@@ -750,14 +750,26 @@ sub ProcessString($$$)
750
750
  my @list = ref $$dataPt eq 'ARRAY' ? @{$$dataPt} : ( $$dataPt );
751
751
  my ($string, $val);
752
752
  $et->VerboseDir('GoPro structure');
753
+ my $docNum = $$et{DOC_NUM};
754
+ my $subDoc = 0;
753
755
  foreach $string (@list) {
754
756
  my @val = split ' ', $string;
755
757
  my $i = 0;
756
758
  foreach $val (@val) {
757
759
  $et->HandleTag($tagTablePtr, $i, $val);
758
- $$tagTablePtr{++$i} or $i = 0;
760
+ next if $$tagTablePtr{++$i};
761
+ # increment subdoc for records stored as string of values (eg. GPS5)
762
+ $i = 0;
763
+ ++$subDoc;
764
+ $$et{DOC_NUM} = "$docNum-$subDoc";
765
+ }
766
+ if ($i) {
767
+ # increment subdoc for records stored as array of strings (eg. GPS9)
768
+ ++$subDoc;
769
+ $$et{DOC_NUM} = "$docNum-$subDoc";
759
770
  }
760
771
  }
772
+ $$et{DOC_NUM} = $docNum;
761
773
  return 1;
762
774
  }
763
775
 
@@ -15,8 +15,9 @@ package Image::ExifTool::LNK;
15
15
  use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
+ use Image::ExifTool::Microsoft;
18
19
 
19
- $VERSION = '1.10';
20
+ $VERSION = '1.11';
20
21
 
21
22
  sub ProcessItemID($$$);
22
23
  sub ProcessLinkInfo($$$);
@@ -441,6 +442,8 @@ sub ProcessLinkInfo($$$);
441
442
  0x08 => {
442
443
  Name => 'CodePage',
443
444
  Format => 'int32u',
445
+ SeparateTable => 'Microsoft CodePage',
446
+ PrintConv => \%Image::ExifTool::Microsoft::codePage,
444
447
  },
445
448
  );
446
449
 
@@ -1198,7 +1198,6 @@ $VERSION = '1.07';
1198
1198
  'Rotation' => {
1199
1199
  PrintConv => {
1200
1200
  'Horizontal' => '0° (nahoru/vlevo)',
1201
- 'Horizontal (Normal)' => '0° (nahoru/vlevo)',
1202
1201
  'Horizontal (normal)' => '0° (nahoru/vlevo)',
1203
1202
  'Rotate 180' => '180° (dolů/vpravo)',
1204
1203
  'Rotate 270 CW' => '90° po směru HR (vlevo/dolů)',
@@ -6912,7 +6912,6 @@ $VERSION = '1.38';
6912
6912
  'Rotation' => {
6913
6913
  Description => 'Ausrichtung',
6914
6914
  PrintConv => {
6915
- 'Horizontal (Normal)' => 'Horizontal (normal)',
6916
6915
  'Rotate 180' => '180° gedreht',
6917
6916
  'Rotate 270 CW' => '90° gegen den Uhrzeigersinn',
6918
6917
  'Rotate 90 CW' => '90° im Uhrzeigersinn',
@@ -8874,7 +8874,6 @@ $VERSION = '1.37';
8874
8874
  '270' => '270°',
8875
8875
  '90' => '90°',
8876
8876
  'Horizontal' => 'Horizontale',
8877
- 'Horizontal (Normal)' => 'Horizontale (normale)',
8878
8877
  'Horizontal (normal)' => 'Horizontale (normale)',
8879
8878
  'Rotate 180' => 'Rotation de 180°',
8880
8879
  'Rotate 270 CW' => 'Rotation antihoraire de 270°',
@@ -6424,7 +6424,6 @@ $VERSION = '1.14';
6424
6424
  Description => 'Rotazione',
6425
6425
  PrintConv => {
6426
6426
  'Horizontal' => 'Orizzontale',
6427
- 'Horizontal (Normal)' => 'Orizzontale (normale)',
6428
6427
  'Horizontal (normal)' => 'Orizzontale (normale)',
6429
6428
  'Rotate 180' => 'Ruota di 180°',
6430
6429
  'Rotate 270 CW' => 'Ruota di 270° in senso orario',