exiftool_vendored 13.30.0 → 13.33.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +57 -1
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +4 -3
  5. data/bin/META.yml +3 -2
  6. data/bin/README +47 -46
  7. data/bin/exiftool +88 -60
  8. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -5
  9. data/bin/lib/Image/ExifTool/Canon.pm +16 -5
  10. data/bin/lib/Image/ExifTool/Exif.pm +7 -4
  11. data/bin/lib/Image/ExifTool/FlashPix.pm +4 -159
  12. data/bin/lib/Image/ExifTool/FujiFilm.pm +13 -3
  13. data/bin/lib/Image/ExifTool/Geotag.pm +5 -3
  14. data/bin/lib/Image/ExifTool/GoPro.pm +23 -4
  15. data/bin/lib/Image/ExifTool/LNK.pm +24 -3
  16. data/bin/lib/Image/ExifTool/Lang/cs.pm +0 -1
  17. data/bin/lib/Image/ExifTool/Lang/de.pm +2 -2
  18. data/bin/lib/Image/ExifTool/Lang/fr.pm +2 -2
  19. data/bin/lib/Image/ExifTool/Lang/it.pm +0 -1
  20. data/bin/lib/Image/ExifTool/Lang/ja.pm +0 -1
  21. data/bin/lib/Image/ExifTool/Lang/nl.pm +0 -1
  22. data/bin/lib/Image/ExifTool/Lang/pl.pm +0 -1
  23. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1
  24. data/bin/lib/Image/ExifTool/LigoGPS.pm +14 -6
  25. data/bin/lib/Image/ExifTool/Microsoft.pm +158 -1
  26. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  27. data/bin/lib/Image/ExifTool/Nikon.pm +80 -39
  28. data/bin/lib/Image/ExifTool/NikonCustom.pm +40 -10
  29. data/bin/lib/Image/ExifTool/Olympus.pm +240 -35
  30. data/bin/lib/Image/ExifTool/PDF.pm +1 -0
  31. data/bin/lib/Image/ExifTool/Panasonic.pm +4 -4
  32. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  33. data/bin/lib/Image/ExifTool/Pentax.pm +276 -56
  34. data/bin/lib/Image/ExifTool/Plot.pm +2 -3
  35. data/bin/lib/Image/ExifTool/QuickTime.pm +13 -5
  36. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +41 -17
  37. data/bin/lib/Image/ExifTool/Sigma.pm +19 -1
  38. data/bin/lib/Image/ExifTool/Sony.pm +5 -2
  39. data/bin/lib/Image/ExifTool/TNEF.pm +487 -0
  40. data/bin/lib/Image/ExifTool/TagLookup.pm +4374 -4262
  41. data/bin/lib/Image/ExifTool/TagNames.pod +259 -22
  42. data/bin/lib/Image/ExifTool/WriteExif.pl +14 -12
  43. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
  44. data/bin/lib/Image/ExifTool/Writer.pl +142 -139
  45. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  46. data/bin/lib/Image/ExifTool.pm +16 -7
  47. data/bin/lib/Image/ExifTool.pod +45 -44
  48. data/bin/perl-Image-ExifTool.spec +46 -45
  49. data/lib/exiftool_vendored/version.rb +1 -1
  50. metadata +3 -2
@@ -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.91';
91
+ $VERSION = '4.94';
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)
@@ -636,9 +636,10 @@ $VERSION = '4.91';
636
636
  '61182.58' => 'Canon RF 70-200mm F2.8 L IS USM Z + RF1.4x', #42
637
637
  '61182.59' => 'Canon RF 70-200mm F2.8 L IS USM Z + RF2x', #42
638
638
  '61182.60' => 'Canon RF 16-28mm F2.8 IS STM', #42
639
- '61182.61' => 'Canon RF 50mm F1.4 L VCM', #42
640
- '61182.62' => 'Canon RF 24mm F1.4 L VCM', #42
641
- '61182.63' => 'Canon RF 20mm F1.4 L VCM', #42
639
+ '61182.61' => 'Canon RF-S 14-30mm F4-6.3 IS STM PZ', #42
640
+ '61182.62' => 'Canon RF 50mm F1.4 L VCM', #42
641
+ '61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
642
+ '61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
642
643
  65535 => 'n/a',
643
644
  );
644
645
 
@@ -1006,6 +1007,7 @@ $VERSION = '4.91';
1006
1007
  0x80000495 => 'EOS R1', #PH
1007
1008
  0x80000496 => 'R5 Mark II', #forum16406
1008
1009
  0x80000498 => 'EOS R100', #25
1010
+ 0x80000516 => 'EOS R50 V', #42
1009
1011
  0x80000520 => 'EOS D2000C', #IB
1010
1012
  0x80000560 => 'EOS D6000C', #PH (guess)
1011
1013
  );
@@ -2619,6 +2621,10 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2619
2621
  # 47 - related to aspect ratio: 100=4:3,70=1:1/16:9,90=3:2,60=4:5 (PH G12)
2620
2622
  # (roughly image area in percent - 4:3=100%,1:1/16:9=75%,3:2=89%,4:5=60%)
2621
2623
  # 48 - 3 for CR2/CR3, 4 or 7 for JPG, -1 for edited JPG (see forum16127)
2624
+ 50 => { #github340
2625
+ Name => 'FocusBracketing',
2626
+ PrintConv => { 0 => 'Disable', 1 => 'Enable' },
2627
+ },
2622
2628
  51 => { #forum16036 (EOS R models)
2623
2629
  Name => 'Clarity',
2624
2630
  PrintConv => {
@@ -2626,6 +2632,10 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2626
2632
  0x7fff => 'n/a',
2627
2633
  },
2628
2634
  },
2635
+ 52 => { #github336
2636
+ Name => 'HDR-PQ',
2637
+ PrintConv => { %offOn, -1 => 'n/a' },
2638
+ },
2629
2639
  );
2630
2640
 
2631
2641
  # focal length information (MakerNotes tag 0x02)
@@ -7032,6 +7042,7 @@ my %ciMaxFocal = (
7032
7042
  320 => 'Canon RF 70-200mm F2.8 L IS USM Z + RF1.4x', #42
7033
7043
  321 => 'Canon RF 70-200mm F2.8 L IS USM Z + RF2x', #42
7034
7044
  323 => 'Canon RF 16-28mm F2.8 IS STM', #42
7045
+ 324 => 'Canon RF-S 14-30mm F4-6.3 IS STM PZ', #42
7035
7046
  325 => 'Canon RF 50mm F1.4 L VCM', #42
7036
7047
  326 => 'Canon RF 24mm F1.4 L VCM', #42
7037
7048
  327 => 'Canon RF 20mm F1.4 L VCM', #42
@@ -8928,7 +8939,7 @@ my %ciMaxFocal = (
8928
8939
  },
8929
8940
  3 => {
8930
8941
  Name => 'HighlightTonePriority',
8931
- PrintConv => \%offOn,
8942
+ PrintConv => { %offOn, 2 => 'Enhanced' }, #github339 (Enhanced)
8932
8943
  },
8933
8944
  4 => {
8934
8945
  Name => 'LongExposureNoiseReduction',
@@ -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.57';
60
+ $VERSION = '4.59';
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',
@@ -2081,7 +2081,7 @@ my %opcodeInfo = (
2081
2081
  0x8822 => {
2082
2082
  Name => 'ExposureProgram',
2083
2083
  Groups => { 2 => 'Camera' },
2084
- Notes => 'the value of 9 is not standard EXIF, but is used by the Canon EOS 7D',
2084
+ Notes => 'the value of 9 is not standard EXIF, but is used by some Canon models',
2085
2085
  Writable => 'int16u',
2086
2086
  PrintConv => {
2087
2087
  0 => 'Not Defined',
@@ -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',
@@ -4350,6 +4352,7 @@ my %opcodeInfo = (
4350
4352
  Writable => 'undef',
4351
4353
  WriteGroup => 'IFD0',
4352
4354
  Protected => 1,
4355
+ Binary => 1,
4353
4356
  },
4354
4357
  0xcd40 => { # DNG 1.7
4355
4358
  Name => 'ProfileGainTableMap2',
@@ -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($$$);
@@ -629,6 +629,9 @@ my %faceCategories = (
629
629
  0x70000 => 'Soft Focus',
630
630
  0x90000 => 'Low Key',
631
631
  0x100000 => 'Light Leak', #forum17392
632
+ 0x130000 => 'Expired Film Green', #forum17392
633
+ 0x130001 => 'Expired Film Red', #forum17392 (NC)
634
+ 0x130002 => 'Expired Film Neutral', #forum17392
632
635
  },
633
636
  },
634
637
  0x1210 => { #2
@@ -829,6 +832,13 @@ my %faceCategories = (
829
832
  },
830
833
  0x1447 => { Name => 'FujiModel', Writable => 'string' },
831
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
+
832
842
  0x144d => { Name => 'RollAngle', Writable => 'rational64s' }, #forum14319
833
843
  0x3803 => { #forum10037
834
844
  Name => 'VideoRecordingMode',
@@ -1561,7 +1571,7 @@ my %faceCategories = (
1561
1571
  6 => { Name => 'FNumber', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)' },
1562
1572
  # 7 - seen 200, 125, 250, 2000
1563
1573
  7 => 'ISO',
1564
- # 8 - seen 0
1574
+ # 8 - seen 0, 65536
1565
1575
  );
1566
1576
 
1567
1577
  #------------------------------------------------------------------------------
@@ -1670,7 +1680,7 @@ sub ProcessFujiDir($$$)
1670
1680
  #------------------------------------------------------------------------------
1671
1681
  # get information from FujiFilm M-RAW header
1672
1682
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
1673
- # Returns: 1 if this was a valid M-RAW headerx
1683
+ # Returns: 1 if this was a valid M-RAW header
1674
1684
  sub ProcessMRAW($$$)
1675
1685
  {
1676
1686
  my ($et, $dirInfo, $tagTablePtr) = @_;
@@ -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.12';
20
+ $VERSION = '1.14';
21
21
 
22
22
  sub ProcessGoPro($$$);
23
23
  sub ProcessString($$$);
@@ -750,19 +750,31 @@ 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
 
764
776
  #------------------------------------------------------------------------------
765
- # Process "GP\x06\0" records in MP4 'mdat'atom
777
+ # Process "GP\x06\0" records in MP4 'mdat' atom
766
778
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref (RAF and DirLen)
767
779
  # Returns: size of GoPro record, or 0 on error
768
780
  sub ProcessGP6($$)
@@ -815,9 +827,16 @@ sub ProcessGoPro($$$)
815
827
 
816
828
  for (; $pos+8<=$dirEnd; $pos+=($size+3)&0xfffffffc) {
817
829
  my ($tag,$fmt,$len,$count) = unpack("x${pos}a4CCn", $$dataPt);
830
+ if ($tag =~ /[^-_a-zA-Z0-9 ]/) {
831
+ $et->Warn('Unrecognized GoPro record') unless $tag eq "\0\0\0\0";
832
+ last;
833
+ }
818
834
  $size = $len * $count;
819
835
  $pos += 8;
820
- last if $pos + $size > $dirEnd;
836
+ if ($pos + $size > $dirEnd) {
837
+ $et->Warn('Truncated GoPro record');
838
+ last;
839
+ }
821
840
  my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
822
841
  last if $tag eq "\0\0\0\0"; # stop at null tag
823
842
  next unless $size or $verbose; # don't save empty values unless verbose
@@ -7,6 +7,7 @@
7
7
  #
8
8
  # References: 1) http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx
9
9
  # 2) http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf
10
+ # 3) https://harfanglab.io/insidethelab/sadfuture-xdspy-latest-evolution/#tid_specifications_ignored
10
11
  #------------------------------------------------------------------------------
11
12
 
12
13
  package Image::ExifTool::LNK;
@@ -14,8 +15,9 @@ package Image::ExifTool::LNK;
14
15
  use strict;
15
16
  use vars qw($VERSION);
16
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
+ use Image::ExifTool::Microsoft;
17
19
 
18
- $VERSION = '1.09';
20
+ $VERSION = '1.11';
19
21
 
20
22
  sub ProcessItemID($$$);
21
23
  sub ProcessLinkInfo($$$);
@@ -440,6 +442,8 @@ sub ProcessLinkInfo($$$);
440
442
  0x08 => {
441
443
  Name => 'CodePage',
442
444
  Format => 'int32u',
445
+ SeparateTable => 'Microsoft CodePage',
446
+ PrintConv => \%Image::ExifTool::Microsoft::codePage,
443
447
  },
444
448
  );
445
449
 
@@ -647,17 +651,32 @@ sub ProcessLNK($$)
647
651
  my @strings = qw(Description RelativePath WorkingDirectory
648
652
  CommandLineArguments IconFileName);
649
653
  for ($i=0; $i<@strings; ++$i) {
654
+ my ($val, $limit);
650
655
  my $mask = 0x04 << $i;
651
656
  next unless $flags & $mask;
652
657
  $raf->Read($buff, 2) or return 1;
658
+ my $pos = $raf->Tell();
653
659
  $len = unpack('v', $buff) or next;
660
+ # Windows doesn't follow their own specification and limits the length
661
+ # for most of these strings (ref 3)
662
+ if ($i != 3 and $len >= 260) {
663
+ $limit = 1;
664
+ if ($len > 260) {
665
+ $len = 260;
666
+ $et->Warn('LNK string data overrun! Possible security issue');
667
+ }
668
+ }
654
669
  $len *= 2 if $flags & 0x80; # characters are 2 bytes if Unicode flag is set
655
670
  $raf->Read($buff, $len) or return 1;
656
- my $val;
671
+ # remove last character if string is at length limit (Windows treats this as a null)
672
+ if ($limit) {
673
+ $len -= $flags & 0x80 ? 2 : 1;
674
+ $buff = substr($buff, 0, $len);
675
+ }
657
676
  $val = $et->Decode($buff, 'UCS2') if $flags & 0x80;
658
677
  $et->HandleTag($tagTablePtr, 0x30000 | $mask, $val,
659
678
  DataPt => \$buff,
660
- DataPos => $raf->Tell() - $len,
679
+ DataPos => $pos,
661
680
  Size => $len,
662
681
  );
663
682
  }
@@ -716,6 +735,8 @@ under the same terms as Perl itself.
716
735
 
717
736
  =item L<http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf>
718
737
 
738
+ =item L<https://harfanglab.io/insidethelab/sadfuture-xdspy-latest-evolution/#tid_specifications_ignored>
739
+
719
740
  =back
720
741
 
721
742
  =head1 SEE ALSO
@@ -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ů)',
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::de;
11
11
  use strict;
12
12
  use vars qw($VERSION);
13
13
 
14
- $VERSION = '1.37';
14
+ $VERSION = '1.38';
15
15
 
16
16
  %Image::ExifTool::Lang::de::Translate = (
17
17
  'AEAperture' => 'AE-Blende',
@@ -5126,6 +5126,7 @@ $VERSION = '1.37';
5126
5126
  'LensType' => {
5127
5127
  Description => 'Objektivtyp',
5128
5128
  PrintConv => {
5129
+ 'None' => 'Keiner',
5129
5130
  'Uncoded lens' => 'Nicht kodiertes Objektiv',
5130
5131
  },
5131
5132
  },
@@ -6911,7 +6912,6 @@ $VERSION = '1.37';
6911
6912
  'Rotation' => {
6912
6913
  Description => 'Ausrichtung',
6913
6914
  PrintConv => {
6914
- 'Horizontal (Normal)' => 'Horizontal (normal)',
6915
6915
  'Rotate 180' => '180° gedreht',
6916
6916
  'Rotate 270 CW' => '90° gegen den Uhrzeigersinn',
6917
6917
  'Rotate 90 CW' => '90° im Uhrzeigersinn',
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::fr;
11
11
  use strict;
12
12
  use vars qw($VERSION);
13
13
 
14
- $VERSION = '1.36';
14
+ $VERSION = '1.37';
15
15
 
16
16
  %Image::ExifTool::Lang::fr::Translate = (
17
17
  'AEAperture' => 'Ouverture AE',
@@ -6607,6 +6607,7 @@ $VERSION = '1.36';
6607
6607
  'LensType' => {
6608
6608
  Description => 'Type d\'objectif',
6609
6609
  PrintConv => {
6610
+ 'None' => 'Aucun',
6610
6611
  'n/a' => 'Non applicable',
6611
6612
  'smc PENTAX-F 100-300mm F4.5-5.6 or Sigma Lens' => 'smc PENTAX-F 100-300mm F4.5-5.6 ou objectif Sigma',
6612
6613
  'smc PENTAX-F 28-80mm F3.5-4.5 or Tokina Lens' => 'smc PENTAX-F 28-80mm F3.5-4.5 ou objectif Tokina',
@@ -8873,7 +8874,6 @@ $VERSION = '1.36';
8873
8874
  '270' => '270°',
8874
8875
  '90' => '90°',
8875
8876
  'Horizontal' => 'Horizontale',
8876
- 'Horizontal (Normal)' => 'Horizontale (normale)',
8877
8877
  'Horizontal (normal)' => 'Horizontale (normale)',
8878
8878
  'Rotate 180' => 'Rotation de 180°',
8879
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',
@@ -4475,7 +4475,6 @@ $VERSION = '1.25';
4475
4475
  Description => '回転',
4476
4476
  PrintConv => {
4477
4477
  'Horizontal' => '水平(標準)',
4478
- 'Horizontal (Normal)' => '水平(標準)',
4479
4478
  'Horizontal (normal)' => '水平(標準)',
4480
4479
  'Rotate 180' => '180度回転',
4481
4480
  'Rotate 270 CW' => '270度回転 CW',
@@ -2567,7 +2567,6 @@ $VERSION = '1.13';
2567
2567
  'Rotation' => {
2568
2568
  PrintConv => {
2569
2569
  'Horizontal' => '0° (boven/links)',
2570
- 'Horizontal (Normal)' => '0° (boven/links)',
2571
2570
  'Horizontal (normal)' => '0° (boven/links)',
2572
2571
  'Rotate 180' => '180° (onder/rechts)',
2573
2572
  'Rotate 270 CW' => 'Draai 270° met de klok mee',
@@ -955,7 +955,6 @@ $VERSION = '1.12';
955
955
  Description => 'Obrót',
956
956
  PrintConv => {
957
957
  'Horizontal' => '0° (góra/lewo)',
958
- 'Horizontal (Normal)' => '0° (góra/lewo)',
959
958
  'Horizontal (normal)' => '0° (góra/lewo)',
960
959
  'Rotate 180' => '180° (dół/prawo)',
961
960
  'Rotate 270 CW' => '90° CW (lewo/dół)',
@@ -970,7 +970,6 @@ $VERSION = '1.08';
970
970
  'Rotation' => {
971
971
  PrintConv => {
972
972
  'Horizontal' => '0° (上/左)',
973
- 'Horizontal (Normal)' => '0° (上/左)',
974
973
  'Horizontal (normal)' => '0° (上/左)',
975
974
  'Rotate 180' => '180° (底/右)',
976
975
  'Rotate 270 CW' => '90° CW (左/底)',