exiftool-vendored.exe 12.55.0 → 12.60.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 (61) hide show
  1. package/bin/exiftool_files/Changes +97 -4
  2. package/bin/exiftool_files/README +19 -19
  3. package/bin/exiftool_files/arg_files/xmp2exif.args +4 -1
  4. package/bin/exiftool_files/config_files/example.config +1 -0
  5. package/bin/exiftool_files/config_files/rotate_regions.config +1 -1
  6. package/bin/exiftool_files/exiftool.pl +198 -123
  7. package/bin/exiftool_files/fmt_files/kml.fmt +3 -0
  8. package/bin/exiftool_files/fmt_files/kml_track.fmt +3 -0
  9. package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +2 -2
  10. package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +2 -2
  11. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +25 -19
  12. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +33 -7
  13. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +5 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +28 -2
  15. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +107 -20
  16. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +92 -9
  17. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +9 -4
  18. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +7 -2
  19. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +30 -7
  20. package/bin/exiftool_files/lib/Image/ExifTool/InfiRay.pm +227 -0
  21. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +53 -7
  22. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +5 -5
  23. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +10 -2
  24. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +5 -4
  25. package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +3 -3
  26. package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +2 -2
  27. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +3 -2
  28. package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +6 -7
  29. package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1199 -1325
  31. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +2 -2
  32. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +1 -1
  33. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +88 -6
  34. package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +32 -15
  35. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +89 -3
  36. package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
  37. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +8 -5
  38. package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +14 -1
  39. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +38 -7
  40. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +44 -13
  41. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +63 -20
  42. package/bin/exiftool_files/lib/Image/ExifTool/README +19 -2
  43. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +34 -13
  44. package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +2 -2
  45. package/bin/exiftool_files/lib/Image/ExifTool/Real.pm +2 -2
  46. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +2 -1
  47. package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +5 -4
  48. package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +9 -3
  49. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +28 -1
  50. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4691 -4624
  51. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +511 -117
  52. package/bin/exiftool_files/lib/Image/ExifTool/VCard.pm +19 -5
  53. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +5 -5
  54. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +42 -0
  55. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +1 -1
  56. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +150 -36
  57. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +19 -4
  58. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +2 -1
  59. package/bin/exiftool_files/lib/Image/ExifTool.pm +248 -54
  60. package/bin/exiftool_files/lib/Image/ExifTool.pod +94 -58
  61. package/package.json +2 -2
@@ -9938,8 +9938,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9938
9938
  },
9939
9939
  },
9940
9940
  217 => { Name => 'MovieMultiSelector', %buttonsZ9, Unknown => 1}, # CSg2-h
9941
- 221 => { Name => 'MovieAFSpeed', ValueConv => '$val - 5', ValueConvInv => '$val + 6' }, # CSg6-a
9942
- 223 => { Name => 'MovieAFSpeedApply', rintConv => {0 => 'Always', 1 => 'Only During Recording'},}, # CSg6-b
9941
+ 221 => { Name => 'MovieAFSpeed', ValueConv => '$val - 5', ValueConvInv => '$val + 5' }, # CSg6-a
9942
+ 223 => { Name => 'MovieAFSpeedApply', PrintConv => {0 => 'Always', 1 => 'Only During Recording'},}, # CSg6-b
9943
9943
  225 => { # CSg7
9944
9944
  Name => 'MovieAFTrackingSensitivity',
9945
9945
  PrintConv => {
@@ -1512,7 +1512,7 @@ my %infoZSeries = (
1512
1512
  6 => 'None',
1513
1513
  },
1514
1514
  }],
1515
- 0x0ee => { Name => 'MovieAFSpeed', ValueConv => '$val - 6', ValueConvInv => '$val + 6' }, # CSg4-a (Z7_2)
1515
+ 0x0ee => { Name => 'MovieAFSpeed', ValueConv => '$val - 6', ValueConvInv => '$val + 6' }, # CSg4-a (Z7_2)
1516
1516
  0x0ef => { # CSg4-b (Z7_2)
1517
1517
  Name => 'MovieAFSpeedApply',
1518
1518
  PrintConv => {
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
40
40
  use Image::ExifTool::Exif;
41
41
  use Image::ExifTool::APP12;
42
42
 
43
- $VERSION = '2.79';
43
+ $VERSION = '2.81';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -116,6 +116,7 @@ my %olympusLensTypes = (
116
116
  '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB
117
117
  '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
118
118
  '0 37 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0 Pro', #forum3833
119
+ '0 39 10' => 'Olympus M.Zuiko Digital ED 90mm F3.5 Macro IS Pro', #forum3833
119
120
  # Sigma lenses
120
121
  '1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8
121
122
  '1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ
@@ -3164,21 +3165,38 @@ my %indexInfo = (
3164
3165
  PrintHex => 1,
3165
3166
  ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
3166
3167
  ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
3167
- PrintConv => [
3168
+ PrintConv => [ # herb values added:
3169
+ # based on code of W.P. in https://exiftool.org/forum/index.php?topic=14144.0
3168
3170
  {
3169
- 0x00 => '(none)',
3170
- 0x01 => 'Center',
3171
+ # 0x00 => '(none)',
3172
+ # 0x01 => 'Center',
3171
3173
  # need to fill this in...
3174
+ 0x00 => '(none)',
3175
+ 0x02 => 'Top-center (horizontal)',
3176
+ 0x04 => 'Right (horizontal)',
3177
+ 0x05 => 'Mid-right (horizontal)',
3178
+ 0x06 => 'Center (horizontal)',
3179
+ 0x07 => 'Mid-left (horizontal)',
3180
+ 0x08 => 'Left (horizontal)',
3181
+ 0x0a => 'Bottom-center (horizontal)',
3182
+ 0x0c => 'Top-center (vertical)',
3183
+ 0x0f => 'Right (vertical)',
3184
+ 0x15 => 'Bottom-center (vertical)',
3185
+ 0x10 => 'Mid-right (vertical)',
3186
+ 0x11 => 'Center (vertical)',
3187
+ 0x12 => 'Mid-left (vertical)',
3188
+ 0x13 => 'Left (vertical)',
3172
3189
  },
3173
3190
  {
3174
3191
  0x00 => 'Single Target',
3175
3192
  0x40 => 'All Target', # (guess)
3176
3193
  },
3177
3194
  ]
3178
- },{ #11
3195
+ },{ #herb all camera model except E-Mxxx and OM-x
3179
3196
  Name => 'AFPoint',
3197
+ Condition => '$$self{Model} !~ /^(E-M|OM-)/ ',
3180
3198
  Writable => 'int16u',
3181
- Notes => 'other models',
3199
+ Notes => 'models other than E-Mxxx and OM-x',
3182
3200
  RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef',
3183
3201
  PrintConv => {
3184
3202
  # (E-P1 always writes 0, maybe other models do too - PH)
@@ -3188,9 +3206,73 @@ my %indexInfo = (
3188
3206
  3 => 'Center (vertical)', #6 (E-510)
3189
3207
  255 => 'None',
3190
3208
  },
3209
+ },{ #herb all newer models E-Mxxx and OM-x; we do not know details
3210
+ Name => 'AFPoint',
3211
+ Writable => 'int16u',
3212
+ Notes => 'other models',
3191
3213
  }
3192
3214
  ],
3193
3215
  # 0x31a Continuous AF parameters?
3216
+ 0x31b => [ #herb, based on investigations of abgestumpft: https://exiftool.org/forum/index.php?topic=14527.0
3217
+ # for newer models E-Mxxx and OM-x
3218
+ {
3219
+ Name => 'AFPointDetails',
3220
+ Condition => '$$self{Model} =~ m/^E-M|^OM-/ ',
3221
+ Writable => 'int16u',
3222
+ Notes => 'models E-Mxxx and OM-x',
3223
+ PrintHex => 1,
3224
+ ValueConv => '(($val >> 13) & 0x7) . " " . (($val >> 12) & 0x1) . " " . (($val >> 11) & 0x1) . " " .
3225
+ # subject detect face and eye half press
3226
+ (($val >> 8) & 0x3) . " " . (($val >> 7) & 0x1) . " " . (($val >> 5) & 0x1) . " " .
3227
+ # eye AF face detect x-AF with MF
3228
+ (($val >> 4) & 0x1) . " " . (($val >> 3) & 0x1) . " " . ($val & 0x7)',
3229
+ # release object found MF...
3230
+ PrintConvColumns => 4,
3231
+ PrintConv => [
3232
+ {
3233
+ # should be identical to AISubjectTrackingMode
3234
+ 0 => 'No Subject Detection',
3235
+ 1 => 'Motorsports',
3236
+ 2 => 'Airplanes',
3237
+ 3 => 'Trains',
3238
+ 4 => 'Birds',
3239
+ 5 => 'Dogs & Cats',
3240
+ },{
3241
+ 0 => 'Face Priority',
3242
+ 1 => 'Target Priority',
3243
+ },{
3244
+ 0 => 'Normal AF',
3245
+ 1 => 'AF on Half Press',
3246
+ },{
3247
+ 0 => 'No Eye-AF',
3248
+ 1 => 'Right Eye Priority',
3249
+ 2 => 'Left Eye Priority',
3250
+ 3 => 'Both Eyes Priority',
3251
+ },{
3252
+ 0 => 'No Face Detection',
3253
+ 1 => 'Face Detection',
3254
+ },{
3255
+ 0 => 'No MF',
3256
+ 1 => 'With MF',
3257
+ },{
3258
+ 0 => 'AF Priority',
3259
+ 1 => 'Release Priority',
3260
+ },{
3261
+ 0 => 'No Object found',
3262
+ 1 => 'Object found',
3263
+ },{
3264
+ 0 => 'MF',
3265
+ 1 => 'S-AF',
3266
+ 2 => 'C-AF',
3267
+ 6 => 'C-AF + TR',
3268
+ },
3269
+ ],
3270
+ },{ # for older models
3271
+ Name => 'AFPointDetails',
3272
+ Writable => 'int16u',
3273
+ Notes => 'other models',
3274
+ }
3275
+ ],
3194
3276
  0x328 => { #PH
3195
3277
  Name => 'AFInfo',
3196
3278
  SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AFInfo' },
@@ -4,6 +4,7 @@
4
4
  # Description: Read OpenEXR meta information
5
5
  #
6
6
  # Revisions: 2011/12/10 - P. Harvey Created
7
+ # 2023/01/31 - PH Added support for multipart images
7
8
  #
8
9
  # References: 1) http://www.openexr.com/
9
10
  #------------------------------------------------------------------------------
@@ -15,7 +16,7 @@ use vars qw($VERSION);
15
16
  use Image::ExifTool qw(:DataAccess :Utils);
16
17
  use Image::ExifTool::GPS;
17
18
 
18
- $VERSION = '1.03';
19
+ $VERSION = '1.04';
19
20
 
20
21
  # supported EXR value format types (other types are extracted as undef binary data)
21
22
  my %formatType = (
@@ -47,14 +48,18 @@ my %formatType = (
47
48
  %Image::ExifTool::OpenEXR::Main = (
48
49
  GROUPS => { 2 => 'Image' },
49
50
  NOTES => q{
50
- Information extracted from EXR images. See L<http://www.openexr.com/> for
51
- the official specification.
51
+ Information extracted from EXR images. Use the ExtractEmbedded option to
52
+ extract information from all frames of a multipart image. See
53
+ L<http://www.openexr.com/> for the official specification.
52
54
  },
53
- _ver => { Name => 'EXRVersion' },
54
- _lay => {
55
- Name => 'Layout',
56
- PrintHex => 1,
57
- PrintConv => { 0 => 'Scan Lines', 0x200 => 'Tiles' },
55
+ _ver => { Name => 'EXRVersion', Notes => 'low byte of Flags word' },
56
+ _flags => { Name => 'Flags',
57
+ PrintConv => { BITMASK => {
58
+ 9 => 'Tiled',
59
+ 10 => 'Long names',
60
+ 11 => 'Deep data',
61
+ 12 => 'Multipart',
62
+ }},
58
63
  },
59
64
  adoptedNeutral => { },
60
65
  altitude => {
@@ -145,6 +150,10 @@ my %formatType = (
145
150
  worldToNDC => { },
146
151
  wrapmodes => { Name => 'WrapModes' },
147
152
  xDensity => { Name => 'XResolution' },
153
+ name => { },
154
+ type => { },
155
+ version => { },
156
+ chunkCount => { },
148
157
  # also observed:
149
158
  # ilut
150
159
  );
@@ -169,15 +178,22 @@ sub ProcessEXR($$)
169
178
  my $tagTablePtr = GetTagTable('Image::ExifTool::OpenEXR::Main');
170
179
 
171
180
  # extract information from header
172
- my $ver = unpack('x4V', $buff);
173
- $et->HandleTag($tagTablePtr, '_ver', $ver & 0xff);
174
- $et->HandleTag($tagTablePtr, '_lay', $ver & 0x200);
175
- my $maxLen = ($ver & 0x400) ? 255 : 31;
181
+ my $flags = unpack('x4V', $buff);
182
+ $et->HandleTag($tagTablePtr, '_ver', $flags & 0xff);
183
+ $et->HandleTag($tagTablePtr, '_flags', $flags & 0xffffff00);
184
+ my $maxLen = ($flags & 0x400) ? 255 : 31;
185
+ my $multi = $flags & 0x1000;
176
186
 
177
187
  # extract attributes
178
188
  for (;;) {
179
- $raf->Read($buff, 68) or last;
180
- last if $buff =~ /^\0/;
189
+ $raf->Read($buff, ($maxLen + 1) * 2 + 5) or last;
190
+ if ($buff =~ /^\0/) {
191
+ last unless $multi and $et->Options('ExtractEmbedded');
192
+ # remove null and process the next frame header as a sub-document
193
+ # (second null is end of all headers)
194
+ last if $buff =~ s/^(\0+)// and length($1) > 1;
195
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
196
+ }
181
197
  unless ($buff =~ /^([^\0]{1,$maxLen})\0([^\0]{1,$maxLen})\0(.{4})/sg) {
182
198
  $et->Warn('EXR format error');
183
199
  last;
@@ -261,7 +277,7 @@ sub ProcessEXR($$)
261
277
 
262
278
  # take image dimensions from dataWindow (with displayWindow as backup)
263
279
  if (($tag eq 'dataWindow' or (not $dim and $tag eq 'displayWindow')) and
264
- $val =~ /^(-?\d+) (-?\d+) (-?\d+) (-?\d+)$/)
280
+ $val =~ /^(-?\d+) (-?\d+) (-?\d+) (-?\d+)$/ and not $$et{DOC_NUM})
265
281
  {
266
282
  $dim = [$3 - $1 + 1, $4 - $2 + 1];
267
283
  }
@@ -278,6 +294,7 @@ sub ProcessEXR($$)
278
294
  }
279
295
  $et->FoundTag($tagInfo, $val);
280
296
  }
297
+ delete $$et{DOC_NUM};
281
298
  if ($dim) {
282
299
  $et->FoundTag('ImageWidth', $$dim[0]);
283
300
  $et->FoundTag('ImageHeight', $$dim[1]);
@@ -36,7 +36,7 @@ use strict;
36
36
  use vars qw($VERSION $AUTOLOAD %stdCase);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
 
39
- $VERSION = '1.61';
39
+ $VERSION = '1.63';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -343,7 +343,12 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
343
343
  Name => 'JUMBF',
344
344
  SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
345
345
  },
346
- # cICP - Coding-independent code points (added in 2022 specification)
346
+ cICP => {
347
+ Name => 'CICodePoints',
348
+ SubDirectory => {
349
+ TagTable => 'Image::ExifTool::PNG::CICodePoints',
350
+ },
351
+ },
347
352
  );
348
353
 
349
354
  # PNG IHDR chunk
@@ -428,6 +433,79 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
428
433
  },
429
434
  );
430
435
 
436
+ # PNG cICP chunk
437
+ %Image::ExifTool::PNG::CICodePoints = (
438
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
439
+ GROUPS => { 1 => 'PNG-cICP', 2 => 'Image' },
440
+ NOTES => q{
441
+ These tags are found in the PNG cICP chunk and belong to the PNG-cICP family
442
+ 1 group.
443
+ },
444
+ # (same as tags in QuickTime::ColorRep)
445
+ 0 => {
446
+ Name => 'ColorPrimaries',
447
+ PrintConv => {
448
+ 1 => 'BT.709',
449
+ 2 => 'Unspecified',
450
+ 4 => 'BT.470 System M (historical)',
451
+ 5 => 'BT.470 System B, G (historical)',
452
+ 6 => 'BT.601',
453
+ 7 => 'SMPTE 240',
454
+ 8 => 'Generic film (color filters using illuminant C)',
455
+ 9 => 'BT.2020, BT.2100',
456
+ 10 => 'SMPTE 428 (CIE 1921 XYZ)',
457
+ 11 => 'SMPTE RP 431-2',
458
+ 12 => 'SMPTE EG 432-1',
459
+ 22 => 'EBU Tech. 3213-E',
460
+ },
461
+ },
462
+ 1 => {
463
+ Name => 'TransferCharacteristics',
464
+ PrintConv => {
465
+ 0 => 'For future use (0)',
466
+ 1 => 'BT.709',
467
+ 2 => 'Unspecified',
468
+ 3 => 'For future use (3)',
469
+ 4 => 'BT.470 System M (historical)',
470
+ 5 => 'BT.470 System B, G (historical)',
471
+ 6 => 'BT.601',
472
+ 7 => 'SMPTE 240 M',
473
+ 8 => 'Linear',
474
+ 9 => 'Logarithmic (100 : 1 range)',
475
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
476
+ 11 => 'IEC 61966-2-4',
477
+ 12 => 'BT.1361',
478
+ 13 => 'sRGB or sYCC',
479
+ 14 => 'BT.2020 10-bit systems',
480
+ 15 => 'BT.2020 12-bit systems',
481
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
482
+ 17 => 'SMPTE ST 428',
483
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
484
+ },
485
+ },
486
+ 2 => {
487
+ Name => 'MatrixCoefficients',
488
+ PrintConv => {
489
+ 0 => 'Identity matrix',
490
+ 1 => 'BT.709',
491
+ 2 => 'Unspecified',
492
+ 3 => 'For future use (3)',
493
+ 4 => 'US FCC 73.628',
494
+ 5 => 'BT.470 System B, G (historical)',
495
+ 6 => 'BT.601',
496
+ 7 => 'SMPTE 240 M',
497
+ 8 => 'YCgCo',
498
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
499
+ 10 => 'BT.2020 constant luminance',
500
+ 11 => 'SMPTE ST 2085 YDzDx',
501
+ 12 => 'Chromaticity-derived non-constant luminance',
502
+ 13 => 'Chromaticity-derived constant luminance',
503
+ 14 => 'BT.2100 ICtCp',
504
+ },
505
+ },
506
+ 3 => 'VideoFullRangeFlag',
507
+ );
508
+
431
509
  # PNG sCAL chunk
432
510
  %Image::ExifTool::PNG::SubjectScale = (
433
511
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -1296,6 +1374,7 @@ sub ProcessPNG($$)
1296
1374
  my $datCount = 0;
1297
1375
  my $datBytes = 0;
1298
1376
  my $fastScan = $et->Options('FastScan');
1377
+ my $md5 = $$et{ImageDataMD5};
1299
1378
  my ($n, $sig, $err, $hbuf, $dbuf, $cbuf);
1300
1379
  my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset);
1301
1380
 
@@ -1375,6 +1454,7 @@ sub ProcessPNG($$)
1375
1454
  if ($datCount and $chunk ne $datChunk) {
1376
1455
  my $s = $datCount > 1 ? 's' : '';
1377
1456
  print $out "$fileType $datChunk ($datCount chunk$s, total $datBytes bytes)\n";
1457
+ print $out "$$et{INDENT}(ImageDataMD5: $datBytes bytes of $datChunk data)\n" if $md5;
1378
1458
  $datCount = $datBytes = 0;
1379
1459
  }
1380
1460
  }
@@ -1461,7 +1541,12 @@ sub ProcessPNG($$)
1461
1541
  }
1462
1542
  # skip over data chunks if possible/necessary
1463
1543
  } elsif (not $validate or $len > $chunkSizeLimit) {
1464
- $raf->Seek($len + 4, 1) or $et->Warn('Seek error'), last;
1544
+ if ($md5) {
1545
+ $et->ImageDataMD5($raf, $len);
1546
+ $raf->Read($cbuf, 4) == 4 or $et->Warn('Truncated data'), last;
1547
+ } else {
1548
+ $raf->Seek($len + 4, 1) or $et->Warn('Seek error'), last;
1549
+ }
1465
1550
  next;
1466
1551
  }
1467
1552
  } elsif ($wasDat and $isTxtChunk{$chunk}) {
@@ -1480,6 +1565,7 @@ sub ProcessPNG($$)
1480
1565
  $et->Warn("Corrupted $fileType image") unless $wasEnd;
1481
1566
  last;
1482
1567
  }
1568
+ $md5->add($dbuf) if $md5 and $datChunk; # add to MD5 if necessary
1483
1569
  if ($verbose or $validate or ($outfile and not $fastScan)) {
1484
1570
  # check CRC when in verbose mode (since we don't care about speed)
1485
1571
  my $crc = CalculateCRC(\$hbuf, undef, 4);
@@ -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.27';
24
+ $VERSION = '1.28';
25
25
 
26
26
  sub ProcessJpgFromRaw($$$);
27
27
  sub WriteJpgFromRaw($$$);
@@ -266,6 +266,7 @@ my %panasonicWhiteBalance = ( #forum9396
266
266
  PanasonicHack => 1,
267
267
  OffsetPair => 0x117, # (use StripByteCounts as the offset pair)
268
268
  NotRealPair => 1, # (to avoid Validate warning)
269
+ IsImageData => 1,
269
270
  },
270
271
  0x119 => {
271
272
  Name => 'DistortionInfo',
@@ -296,6 +297,20 @@ my %panasonicWhiteBalance = ( #forum9396
296
297
  },
297
298
  },
298
299
  # 0x122 - int32u: RAWDataOffset for the GH5s/GX9, or pointer to end of raw data for G9 (forum9295)
300
+ 0x127 => { #github193 (newer models)
301
+ Name => 'JpgFromRaw2',
302
+ Groups => { 2 => 'Preview' },
303
+ DataTag => 'JpgFromRaw2',
304
+ RawConv => '$self->ValidateImage(\$val,$tag)',
305
+ },
306
+ 0x13b => {
307
+ Name => 'Artist',
308
+ Groups => { 2 => 'Author' },
309
+ Permanent => 1, # (so we don't add it if the model doesn't write it)
310
+ Writable => 'string',
311
+ WriteGroup => 'IFD0',
312
+ RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
313
+ },
299
314
  0x2bc => { # PH Extension!!
300
315
  Name => 'ApplicationNotes', # (writable directory!)
301
316
  Writable => 'int8u',
@@ -318,6 +333,17 @@ my %panasonicWhiteBalance = ( #forum9396
318
333
  noise-reduction strengths the R, G and B channels
319
334
  },
320
335
  },
336
+ 0x8298 => { #github193
337
+ Name => 'Copyright',
338
+ Groups => { 2 => 'Author' },
339
+ Permanent => 1, # (so we don't add it if the model doesn't write it)
340
+ Format => 'undef',
341
+ Writable => 'string',
342
+ WriteGroup => 'IFD0',
343
+ RawConv => $Image::ExifTool::Exif::Main{0x8298}{RawConv},
344
+ RawConvInv => $Image::ExifTool::Exif::Main{0x8298}{RawConvInv},
345
+ PrintConvInv => $Image::ExifTool::Exif::Main{0x8298}{PrintConvInv},
346
+ },
321
347
  0x83bb => { # PH Extension!!
322
348
  Name => 'IPTC-NAA', # (writable directory!)
323
349
  Format => 'undef', # convert binary values as undef
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
58
58
  use Image::ExifTool::GPS;
59
59
  use Image::ExifTool::HP;
60
60
 
61
- $VERSION = '3.41';
61
+ $VERSION = '3.42';
62
62
 
63
63
  sub CryptShutterCount($$);
64
64
  sub PrintFilter($$$);
@@ -72,10 +72,7 @@ sub DecodeAFPoints($$$$;$);
72
72
  Notes => q{
73
73
  The first number gives the series of the lens, and the second identifies the
74
74
  lens model. Note that newer series numbers may not always be properly
75
- identified by cameras running older firmware versions. Decimal values have
76
- been added to differentiate lenses which would otherwise have the same
77
- LensType, and are used by the Composite LensID tag when attempting to
78
- identify the specific lens model.
75
+ identified by cameras running older firmware versions.
79
76
  },
80
77
  OTHER => sub {
81
78
  my ($val, $inv, $conv) = @_;
@@ -4081,6 +4078,7 @@ my %binaryDataAttrs = (
4081
4078
  ValueConvInv => '$val=~s/\.\d+$//; $val',
4082
4079
  PrintConv => \%pentaxLensTypes,
4083
4080
  SeparateTable => 1,
4081
+ PrintInt => 1,
4084
4082
  },
4085
4083
  3 => { #PH
4086
4084
  Name => 'ExtenderStatus',
@@ -4104,6 +4102,7 @@ my %binaryDataAttrs = (
4104
4102
  ValueConvInv => '$val=~s/\.\d+$//; $val',
4105
4103
  PrintConv => \%pentaxLensTypes,
4106
4104
  SeparateTable => 1,
4105
+ PrintInt => 1,
4107
4106
  },
4108
4107
  3 => {
4109
4108
  Name => 'LensData',
@@ -4139,6 +4138,7 @@ my %binaryDataAttrs = (
4139
4138
  },
4140
4139
  PrintConv => \%pentaxLensTypes,
4141
4140
  SeparateTable => 1,
4141
+ PrintInt => 1,
4142
4142
  },
4143
4143
  4 => {
4144
4144
  Name => 'LensData',
@@ -4174,6 +4174,7 @@ my %binaryDataAttrs = (
4174
4174
  },
4175
4175
  PrintConv => \%pentaxLensTypes,
4176
4176
  SeparateTable => 1,
4177
+ PrintInt => 1,
4177
4178
  },
4178
4179
  13 => {
4179
4180
  Name => 'LensData',
@@ -4209,6 +4210,7 @@ my %binaryDataAttrs = (
4209
4210
  },
4210
4211
  PrintConv => \%pentaxLensTypes,
4211
4212
  SeparateTable => 1,
4213
+ PrintInt => 1,
4212
4214
  },
4213
4215
  12 => {
4214
4216
  Name => 'LensData',
@@ -4245,6 +4247,7 @@ my %binaryDataAttrs = (
4245
4247
  },
4246
4248
  PrintConv => \%pentaxLensTypes,
4247
4249
  SeparateTable => 1,
4250
+ PrintInt => 1,
4248
4251
  },
4249
4252
  15 => {
4250
4253
  Name => 'LensData',
@@ -15,7 +15,7 @@ use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
  use Image::ExifTool::Exif;
17
17
 
18
- $VERSION = '1.07';
18
+ $VERSION = '1.08';
19
19
 
20
20
  sub WritePhaseOne($$$);
21
21
  sub ProcessPhaseOne($$$);
@@ -84,6 +84,7 @@ my @formatName = ( undef, 'string', 'int16s', undef, 'int32s' );
84
84
  Name => 'RawData',
85
85
  Format => 'undef', # (actually 2-byte integers, but don't convert)
86
86
  Binary => 1,
87
+ IsImageData => 1,
87
88
  PutFirst => 1,
88
89
  Writable => 0,
89
90
  Drop => 1, # don't copy to other file types
@@ -584,6 +585,7 @@ sub ProcessPhaseOne($$$)
584
585
  my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
585
586
  my $binary = $et->Options('Binary');
586
587
  my $verbose = $et->Options('Verbose');
588
+ my $md5 = $$et{ImageDataMD5};
587
589
  my $htmlDump = $$et{HTML_DUMP};
588
590
 
589
591
  return 0 if $dirLen < 12;
@@ -676,6 +678,17 @@ sub ProcessPhaseOne($$$)
676
678
  }
677
679
  }
678
680
  }
681
+ if ($md5 and $tagInfo and $$tagInfo{IsImageData}) {
682
+ my ($pos, $len) = ($valuePtr, $size);
683
+ while ($len) {
684
+ my $n = $len > 65536 ? 65536 : $len;
685
+ my $tmp = substr($$dataPt, $pos, $n);
686
+ $md5->add($tmp);
687
+ $len -= $n;
688
+ $pos += $n;
689
+ }
690
+ $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $size bytes of PhaseOne:$$tagInfo{Name})\n");
691
+ }
679
692
  my %parms = (
680
693
  DirName => $ifdType,
681
694
  Index => $index,
@@ -28,7 +28,7 @@ use strict;
28
28
  use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
29
29
  use Image::ExifTool qw(:DataAccess :Utils);
30
30
 
31
- $VERSION = '1.67';
31
+ $VERSION = '1.69';
32
32
 
33
33
  sub ProcessPhotoshop($$$);
34
34
  sub WritePhotoshop($$$);
@@ -74,7 +74,7 @@ my %thumbnailInfo = (
74
74
  my @tags = qw{ImageWidth ImageHeight FileType};
75
75
  my $info = $et->ImageInfo(\$val, @tags);
76
76
  my ($w, $h, $type) = @$info{@tags};
77
- $w and $h and $type eq 'JPEG' or warn("Not a valid JPEG image\n"), return undef;
77
+ $w and $h and $type and $type eq 'JPEG' or warn("Not a valid JPEG image\n"), return undef;
78
78
  my $wbytes = int(($w * 24 + 31) / 32) * 4;
79
79
  return pack('N6n2', 1, $w, $h, $wbytes, $wbytes * $h, length($val), 24, 1) . $val;
80
80
  },
@@ -571,6 +571,13 @@ my %unicodeString = (
571
571
  ValueConv => '100 * $val / 255',
572
572
  PrintConv => 'sprintf("%d%%",$val)',
573
573
  },
574
+ _xvis => {
575
+ Name => 'LayerVisible',
576
+ Format => 'int8u',
577
+ List => 1,
578
+ ValueConv => '$val & 0x02',
579
+ PrintConv => { 0x02 => 'No', 0x00 => 'Yes' },
580
+ },
574
581
  # tags extracted from additional layer information (tag ID's are real)
575
582
  # - must be able to accommodate a blank entry to preserve the list ordering
576
583
  luni => {
@@ -589,6 +596,16 @@ my %unicodeString = (
589
596
  List => 1,
590
597
  Unknown => 1,
591
598
  },
599
+ lclr => {
600
+ Name => 'LayerColors',
601
+ Format => 'int16u',
602
+ Count => 1,
603
+ List => 1,
604
+ PrintConv => {
605
+ 0=>'None', 1=>'Red', 2=>'Orange', 3=>'Yellow',
606
+ 4=>'Green', 5=>'Blue', 6=>'Violet', 7=>'Gray',
607
+ },
608
+ },
592
609
  shmd => { # layer metadata (undocumented structure)
593
610
  # (for now, only extract layerTime. May also contain "layerXMP" --
594
611
  # it would be nice to decode this but I need a sample)
@@ -603,6 +620,13 @@ my %unicodeString = (
603
620
  ValueConv => 'length $val ? ConvertUnixTime($val,1) : ""',
604
621
  PrintConv => 'length $val ? $self->ConvertDateTime($val) : ""',
605
622
  },
623
+ lsct => {
624
+ Name => 'LayerSections',
625
+ Format => 'int32u',
626
+ Count => 1,
627
+ List => 1,
628
+ PrintConv => { 0 => 'Layer', 1 => 'Folder (open)', 2 => 'Folder (closed)', 3 => 'Divider' },
629
+ },
606
630
  );
607
631
 
608
632
  # tags extracted from ImageSourceData found in TIFF images (ref PH)
@@ -682,7 +706,7 @@ sub ProcessLayersAndMask($$$)
682
706
  local $_;
683
707
  my ($et, $dirInfo, $tagTablePtr) = @_;
684
708
  my $raf = $$dirInfo{RAF};
685
- my $fileType = $$et{VALUE}{FileType};
709
+ my $fileType = $$et{FileType};
686
710
  my $data;
687
711
 
688
712
  return 0 unless $fileType eq 'PSD' or $fileType eq 'PSB'; # (no layer section in CS1 files)
@@ -748,17 +772,16 @@ sub ProcessLayers($$$)
748
772
  my $pos = 0;
749
773
  return 0 if $dirLen < 2;
750
774
  $raf->Read($buff, 2) == 2 or return 0;
751
- my $num = Get16s(\$buff, 0);
775
+ my $num = Get16s(\$buff, 0); # number of layers
752
776
  $num = -$num if $num < 0; # (first channel is transparency data if negative)
753
777
  $et->VerboseDir('Layers', $num, $dirLen);
754
778
  $et->HandleTag($tagTablePtr, '_xcnt', $num, Start => $pos, Size => 2, %dinfo); # LayerCount
755
779
  my $oldIndent = $$et{INDENT};
756
780
  $$et{INDENT} .= '| ';
757
-
758
781
  $pos += 2;
759
782
  my $psb = $$et{IsPSB}; # is PSB format?
760
783
  my $psiz = $psb ? 8 : 4;
761
- for ($i=0; $i<$num; ++$i) {
784
+ for ($i=0; $i<$num; ++$i) { # process each layer
762
785
  $et->VPrint(0, $oldIndent.'+ [Layer '.($i+1)." of $num]\n");
763
786
  last if $pos + 18 > $dirLen;
764
787
  $raf->Read($buff, 18) == 18 or last;
@@ -776,6 +799,7 @@ sub ProcessLayers($$$)
776
799
  $sig =~ /^(8BIM|MIB8)$/ or last; # verify signature
777
800
  $et->HandleTag($tagTablePtr, '_xbnd', undef, Start => 4, Size => 4, %dinfo);
778
801
  $et->HandleTag($tagTablePtr, '_xopc', undef, Start => 8, Size => 1, %dinfo);
802
+ $et->HandleTag($tagTablePtr, '_xvis', undef, Start =>10, Size => 1, %dinfo);
779
803
  my $nxt = $pos + 16 + Get32u(\$buff, 12);
780
804
  $n = Get32u(\$buff, 16); # get size of layer mask data
781
805
  $pos += 20 + $n; # skip layer mask data
@@ -823,7 +847,7 @@ sub ProcessLayers($$$)
823
847
  $raf->Read($buff, $n) == $n or last;
824
848
  $dinfo{DataPos} = $pos;
825
849
  while ($count{$tag} < $i) {
826
- $et->HandleTag($tagTablePtr, $tag, '');
850
+ $et->HandleTag($tagTablePtr, $tag, $tag eq 'lsct' ? 0 : '');
827
851
  ++$count{$tag};
828
852
  }
829
853
  $et->HandleTag($tagTablePtr, $tag, undef, Start => 0, Size => $n, %dinfo);
@@ -840,6 +864,13 @@ sub ProcessLayers($$$)
840
864
  }
841
865
  $pos = $nxt;
842
866
  }
867
+ # pad lists if necessary to have an entry for each layer
868
+ foreach (sort keys %count) {
869
+ while ($count{$_} < $num) {
870
+ $et->HandleTag($tagTablePtr, $_, $_ eq 'lsct' ? 0 : '');
871
+ ++$count{$_};
872
+ }
873
+ }
843
874
  $$et{INDENT} = $oldIndent;
844
875
  return 1;
845
876
  }