exiftool_vendored 12.57.0 → 12.58.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +14 -0
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/config_files/rotate_regions.config +1 -1
  7. data/bin/exiftool +25 -21
  8. data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  9. data/bin/lib/Image/ExifTool/APE.pm +2 -2
  10. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +13 -14
  11. data/bin/lib/Image/ExifTool/Canon.pm +26 -6
  12. data/bin/lib/Image/ExifTool/DJI.pm +28 -2
  13. data/bin/lib/Image/ExifTool/Exif.pm +24 -5
  14. data/bin/lib/Image/ExifTool/FlashPix.pm +2 -2
  15. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
  16. data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
  17. data/bin/lib/Image/ExifTool/LNK.pm +5 -4
  18. data/bin/lib/Image/ExifTool/MPEG.pm +2 -2
  19. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  20. data/bin/lib/Image/ExifTool/Minolta.pm +6 -7
  21. data/bin/lib/Image/ExifTool/Nikon.pm +385 -110
  22. data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
  23. data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
  24. data/bin/lib/Image/ExifTool/QuickTime.pm +5 -5
  25. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
  26. data/bin/lib/Image/ExifTool/README +8 -0
  27. data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
  28. data/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
  29. data/bin/lib/Image/ExifTool/Sigma.pm +4 -4
  30. data/bin/lib/Image/ExifTool/Sony.pm +23 -1
  31. data/bin/lib/Image/ExifTool/TagLookup.pm +4457 -4441
  32. data/bin/lib/Image/ExifTool/TagNames.pod +76 -12
  33. data/bin/lib/Image/ExifTool/Validate.pm +5 -5
  34. data/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
  35. data/bin/lib/Image/ExifTool/Writer.pl +3 -1
  36. data/bin/lib/Image/ExifTool/XMP.pm +2 -2
  37. data/bin/lib/Image/ExifTool.pm +57 -12
  38. data/bin/perl-Image-ExifTool.spec +1 -1
  39. data/lib/exiftool_vendored/version.rb +1 -1
  40. metadata +2 -2
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 26359 tags, with 16845 unique tag names.
15
+ They contain a total of 26381 tags, with 16854 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -28,7 +28,8 @@ gives the order of values for a serial data stream.
28
28
  A B<Tag Name> is the handle by which the information is accessed in
29
29
  ExifTool. In some instances, more than one name may correspond to a single
30
30
  tag ID. In these cases, the actual name used depends on the context in
31
- which the information is found. Case is not significant for tag names. A
31
+ which the information is found. Valid characters in a tag name are A-Z,
32
+ a-z, 0-9, hyphen (-) and underline (_). Case is not significant. A
32
33
  question mark (C<?>) after a tag name indicates that the information is
33
34
  either not understood, not verified, or not very useful -- these tags are
34
35
  not extracted by ExifTool unless the Unknown (-u) option is enabled. Be
@@ -124,6 +125,8 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
124
125
  FPXR FlashPix
125
126
  InfiRayFactory InfiRay Factory
126
127
  ThermalParams DJI ThermalParams
128
+ ThermalParams2 DJI ThermalParams2
129
+ ThermalParams3 DJI ThermalParams3
127
130
  PreviewImage no
128
131
  'APP5' RMETA Ricoh RMETA
129
132
  SamsungUniqueID Samsung APP5
@@ -140,6 +143,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
140
143
  Huawei Unknown
141
144
  Qualcomm Qualcomm
142
145
  InfiRayOpMode InfiRay OpMode
146
+ DJI-DBG DJI Info
143
147
  'APP8' SPIFF JPEG SPIFF
144
148
  InfiRayIsothermal InfiRay Isothermal
145
149
  'APP9' MediaJukebox JPEG MediaJukebox
@@ -10866,6 +10870,30 @@ Thermal parameters extracted from APP4 of DJI RJPEG files from the ZH20T.
10866
10870
  86 DB no
10867
10871
  88 KK no
10868
10872
 
10873
+ =head3 DJI ThermalParams2 Tags
10874
+
10875
+ Thermal parameters extracted from APP4 of DJI M3T RJPEG files.
10876
+
10877
+ Index1 Tag Name Writable
10878
+ ------ -------- --------
10879
+ 0 AmbientTemperature no
10880
+ 4 ObjectDistance no
10881
+ 8 Emissivity no
10882
+ 12 RelativeHumidity no
10883
+ 16 ReflectedTemperature no
10884
+ 101 IDString no
10885
+
10886
+ =head3 DJI ThermalParams3 Tags
10887
+
10888
+ Thermal parameters extracted from APP4 of some DJI RJPEG files.
10889
+
10890
+ Index1 Tag Name Writable
10891
+ ------ -------- --------
10892
+ 4 RelativeHumidity no
10893
+ 6 ObjectDistance no
10894
+ 8 Emissivity no
10895
+ 10 ReflectedTemperature no
10896
+
10869
10897
  =head2 FLIR Tags
10870
10898
 
10871
10899
  Information extracted from the maker notes of JPEG images from thermal
@@ -13707,6 +13735,8 @@ DiMAGE X and Xt.
13707
13735
  ShotInfoD300b Nikon ShotInfoD300b
13708
13736
  ShotInfoD300S Nikon ShotInfoD300S
13709
13737
  ShotInfoD700 Nikon ShotInfoD700
13738
+ ShotInfoD780 Nikon ShotInfoD780
13739
+ ShotInfoD7500 Nikon ShotInfoD7500
13710
13740
  ShotInfoD800 Nikon ShotInfoD800
13711
13741
  ShotInfoD810 Nikon ShotInfoD810
13712
13742
  ShotInfoD850 Nikon ShotInfoD850
@@ -14246,6 +14276,34 @@ firmware 1.02f.
14246
14276
  647 ShutterCount int32u
14247
14277
  804 CustomSettingsD700 NikonCustom SettingsD700
14248
14278
 
14279
+ =head3 Nikon ShotInfoD780 Tags
14280
+
14281
+ These tags are extracted from encrypted data in images from the D780.
14282
+
14283
+ Index Tag Name Writable
14284
+ ----- -------- --------
14285
+ 0 ShotInfoVersion no
14286
+ 4 FirmwareVersion no
14287
+ 156 OrientOffset Nikon OrientationInfo
14288
+
14289
+ =head3 Nikon OrientationInfo Tags
14290
+
14291
+ Index1 Tag Name Writable
14292
+ ------ -------- --------
14293
+ 0 RollAngle fixed32u
14294
+ 4 PitchAngle fixed32u
14295
+ 8 YawAngle fixed32u
14296
+
14297
+ =head3 Nikon ShotInfoD7500 Tags
14298
+
14299
+ These tags are extracted from encrypted data in images from the D7500.
14300
+
14301
+ Index Tag Name Writable
14302
+ ----- -------- --------
14303
+ 0 ShotInfoVersion no
14304
+ 4 FirmwareVersion no
14305
+ 160 OrientOffset Nikon OrientationInfo
14306
+
14249
14307
  =head3 Nikon ShotInfoD800 Tags
14250
14308
 
14251
14309
  These tags are extracted from encrypted data in images from the D800.
@@ -14299,14 +14357,6 @@ These tags are extracted from encrypted data in images from the D810.
14299
14357
  4 ISOAutoShutterTime int8u & 0x3f
14300
14358
  5 ISOAutoHiLimit int8u & 0xff
14301
14359
 
14302
- =head3 Nikon OrientationInfo Tags
14303
-
14304
- Index1 Tag Name Writable
14305
- ------ -------- --------
14306
- 0 RollAngle fixed32u
14307
- 4 PitchAngle fixed32u
14308
- 8 YawAngle fixed32u
14309
-
14310
14360
  =head3 Nikon ShotInfoD850 Tags
14311
14361
 
14312
14362
  These tags are extracted from encrypted data in images from the D850.
@@ -14606,6 +14656,7 @@ These tags are extracted from encrypted data in images from the Z9.
14606
14656
  0 ShotInfoVersion no
14607
14657
  4 FirmwareVersion no
14608
14658
  48 SequenceOffset Nikon SeqInfoZ9
14659
+ 88 Offset13 Nikon Offset13InfoZ9
14609
14660
  132 OrientOffset Nikon OrientationInfo
14610
14661
  140 MenuOffset Nikon MenuInfoZ9
14611
14662
 
@@ -14616,6 +14667,15 @@ These tags are extracted from encrypted data in images from the Z9.
14616
14667
  32 FocusShiftShooting int8u~
14617
14668
  40 IntervalShooting int16u~
14618
14669
 
14670
+ =head3 Nikon Offset13InfoZ9 Tags
14671
+
14672
+ Index1 Tag Name Writable
14673
+ ------ -------- --------
14674
+ 3048 AFAreaInitialXPosition int8s~
14675
+ 3049 AFAreaInitialYPosition int8s~
14676
+ 3050 AFAreaInitialWidth no
14677
+ 3051 AFAreaInitialHeight no
14678
+
14619
14679
  =head3 Nikon MenuInfoZ9 Tags
14620
14680
 
14621
14681
  Index1 Tag Name Writable
@@ -14662,6 +14722,7 @@ These tags are used by the Z9.
14662
14722
  556 SecondarySlotFunction int8u
14663
14723
  572 DXCropAlert int8u
14664
14724
  574 SubjectDetection int8u
14725
+ 576 DynamicAFAreaSize int8u
14665
14726
  604 MovieImageArea? int8u & 0x01
14666
14727
  614 MovieType? int8u
14667
14728
  616 MovieISOAutoHiLimit? int16u
@@ -14737,6 +14798,7 @@ These tags are used by the Z9 firmware 3.00.
14737
14798
  576 SecondarySlotFunction int8u
14738
14799
  592 DXCropAlert int8u
14739
14800
  594 SubjectDetection int8u
14801
+ 596 DynamicAFAreaSize int8u
14740
14802
  636 HighFrequencyFlickerReductionShooting? int8u
14741
14803
  646 MovieImageArea? int8u & 0x01
14742
14804
  656 MovieType? int8u
@@ -14938,15 +15000,16 @@ Tags found in the encrypted LensData from cameras such as the Z6 and Z7.
14938
15000
  18 MaxApertureAtMaxFocal int8u
14939
15001
  19 MCUVersion int8u
14940
15002
  20 EffectiveMaxAperture int8u
15003
+ 47 NewLensData undef[17]
14941
15004
  48 LensID int16u
14942
- 53 LensMountType? int8u
15005
+ 53 LensMountType int8u
14943
15006
  54 MaxAperture int16u
14944
15007
  56 FNumber int16u
14945
15008
  60 FocalLength int16u
14946
15009
  76 FocusDistanceRangeWidth? int8u
14947
15010
  78 FocusDistance int16u~
14948
15011
  86 LensDriveEnd? int8u
14949
- 90 LensPositionAbsolute? int32s
15012
+ 90 LensPositionAbsolute int32s
14950
15013
 
14951
15014
  =head3 Nikon LensDataUnknown Tags
14952
15015
 
@@ -38055,6 +38118,7 @@ FileName.
38055
38118
  ICC_Profile ICC_Profile yes!
38056
38119
  ID3Size File no
38057
38120
  IPTC IPTC yes!
38121
+ ImageDataMD5 File no
38058
38122
  ImageHeight File no
38059
38123
  ImageWidth File no
38060
38124
  JPEGDigest File no
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
17
17
  use strict;
18
18
  use vars qw($VERSION %exifSpec);
19
19
 
20
- $VERSION = '1.19';
20
+ $VERSION = '1.20';
21
21
 
22
22
  use Image::ExifTool qw(:Utils);
23
23
  use Image::ExifTool::Exif;
@@ -437,8 +437,8 @@ sub ValidateExif($$$$$$$$)
437
437
  $et->Warn(sprintf('Wrong IFD for 0x%.4x %s (should be %s not %s)', $tag, $$ti{Name}, $wgp, $ifd));
438
438
  }
439
439
  }
440
- } elsif (not $otherSpec{$$et{VALUE}{FileType}} or
441
- (not $otherSpec{$$et{VALUE}{FileType}}{$tag} and not $otherSpec{$$et{VALUE}{FileType}}{All}))
440
+ } elsif (not $otherSpec{$$et{FileType}} or
441
+ (not $otherSpec{$$et{FileType}}{$tag} and not $otherSpec{$$et{FileType}}{All}))
442
442
  {
443
443
  if ($tagTablePtr eq \%Image::ExifTool::Exif::Main or $$tagInfo{Unknown}) {
444
444
  $et->Warn(sprintf('Non-standard %s tag 0x%.4x %s', $ifd, $tag, $$ti{Name}), 1);
@@ -459,8 +459,8 @@ sub ValidateExif($$$$$$$$)
459
459
  $et->Warn(sprintf('Non-standard count (%d) for %s 0x%.4x %s', $count, $ifd, $tag, $$ti{Name}));
460
460
  }
461
461
  }
462
- } elsif (not $otherSpec{$$et{VALUE}{FileType}} or
463
- (not $otherSpec{$$et{VALUE}{FileType}}{$tag} and not $otherSpec{$$et{VALUE}{FileType}}{All}))
462
+ } elsif (not $otherSpec{$$et{FileType}} or
463
+ (not $otherSpec{$$et{FileType}}{$tag} and not $otherSpec{$$et{FileType}}{All}))
464
464
  {
465
465
  $et->Warn(sprintf('Unknown %s tag 0x%.4x', $ifd, $tag), 1);
466
466
  }
@@ -419,6 +419,48 @@ sub ValidateImageData($$$;$)
419
419
  }
420
420
  }
421
421
 
422
+ #------------------------------------------------------------------------------
423
+ # Add specified image data to ImageDataMD5 hash
424
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) lookup for [tagInfo,value] based on tagID
425
+ sub AddImageDataMD5($$$)
426
+ {
427
+ my ($et, $dirInfo, $offsetInfo) = @_;
428
+ my ($tagID, $offset, $buff);
429
+
430
+ my $verbose = $et->Options('Verbose');
431
+ my $md5 = $$et{ImageDataMD5};
432
+ my $raf = $$dirInfo{RAF};
433
+ my $base = $$dirInfo{Base} || 0;
434
+
435
+ foreach $tagID (sort keys %$offsetInfo) {
436
+ next unless ref $$offsetInfo{$tagID} eq 'ARRAY'; # ignore scalar tag values used for Validate
437
+ my $tagInfo = $$offsetInfo{$tagID}[0];
438
+ next unless $$tagInfo{IsImageData} and $$tagInfo{OffsetPair}; # only consider image data
439
+ my $sizeID = $$tagInfo{OffsetPair};
440
+ next unless $sizeID and $$offsetInfo{$sizeID};
441
+ my @offsets = split ' ', $$offsetInfo{$tagID}[1];
442
+ my @sizes = split ' ', $$offsetInfo{$sizeID}[1];
443
+ my $total = 0;
444
+ foreach $offset (@offsets) {
445
+ my $size = shift @sizes;
446
+ next unless $offset =~ /^\d+$/ and $size and $size =~ /^\d+$/ and $size;
447
+ next unless $raf->Seek($offset+$base, 0);
448
+ while ($size) {
449
+ my $bytes = $size > 65536 ? 65536 : $size;
450
+ $raf->Read($buff, $bytes) or last;
451
+ $md5->add($buff);
452
+ $total += length($buff);
453
+ $size -= $bytes;
454
+ }
455
+ }
456
+ if ($verbose) {
457
+ my $name = "$$dirInfo{DirName}:$$tagInfo{Name}";
458
+ $name =~ s/Offsets|Start$//;
459
+ $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $total bytes of $name data)\n");
460
+ }
461
+ }
462
+ }
463
+
422
464
  #------------------------------------------------------------------------------
423
465
  # Handle error while writing EXIF
424
466
  # Inputs: 0) ExifTool ref, 1) error string, 2) tag table ref
@@ -1419,6 +1419,8 @@ sub SetNewValuesFromFile($$;@)
1419
1419
  $tag =~ s/(.+?)\s*(>|<) ?//;
1420
1420
  $$opts{EXPR} = 1; # flag this expression
1421
1421
  } else {
1422
+ # (not sure why this is here because sign should be before '<')
1423
+ # (--> allows "<+" or "<-", which is an undocumented feature)
1422
1424
  $opt = $1 if $tag =~ s/^([-+])\s*//;
1423
1425
  }
1424
1426
  }
@@ -4204,7 +4206,7 @@ sub WriteDirectory($$$;$)
4204
4206
  return '' unless $dataPt or $$dirInfo{RAF}; # nothing to do if block never existed
4205
4207
  # don't allow MakerNotes to be removed from RAW files
4206
4208
  if ($blockName eq 'MakerNotes' and $rawType{$$self{FileType}}) {
4207
- $self->Warn("Can't delete MakerNotes from $$self{VALUE}{FileType}",1);
4209
+ $self->Warn("Can't delete MakerNotes from $$self{FileType}",1);
4208
4210
  return undef;
4209
4211
  }
4210
4212
  $verb = 'Deleting';
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.56';
53
+ $VERSION = '3.57';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -3097,7 +3097,7 @@ sub ScanForXMP($$)
3097
3097
  undef $buff;
3098
3098
  }
3099
3099
  }
3100
- unless ($$et{VALUE}{FileType}) {
3100
+ unless ($$et{FileType}) {
3101
3101
  $$et{FILE_TYPE} = $$et{FILE_EXT};
3102
3102
  $et->SetFileType('<unknown file containing XMP>', undef, '');
3103
3103
  }
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars);
31
31
 
32
- $VERSION = '12.57';
32
+ $VERSION = '12.58';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -1821,6 +1821,13 @@ my %systemTagsNotes = (
1821
1821
  if specifically requested
1822
1822
  },
1823
1823
  },
1824
+ ImageDataMD5 => {
1825
+ Notes => q{
1826
+ MD5 of image data. Generated only if specifically requested for JPEG and
1827
+ TIFF-based images, except Panasonic raw for now. Includes image data,
1828
+ OtherImage and JpgFromRaw in the MD5, but not ThumbnailImage or PreviewImage
1829
+ },
1830
+ },
1824
1831
  );
1825
1832
 
1826
1833
  # tags defined by UserParam option (added at runtime)
@@ -2479,7 +2486,15 @@ sub ExtractInfo($;@)
2479
2486
  $self->WarnOnce('Install Time::HiRes to generate ProcessingTime');
2480
2487
  }
2481
2488
  }
2482
-
2489
+
2490
+ # create MD5 object if ImageDataMD5 is requested
2491
+ if ($$req{imagedatamd5} and not $$self{ImageDataMD5}) {
2492
+ if (require Digest::MD5) {
2493
+ $$self{ImageDataMD5} = Digest::MD5->new;
2494
+ } else {
2495
+ $self->WarnOnce('Install Digest::MD5 to calculate image data MD5');
2496
+ }
2497
+ }
2483
2498
  ++$$self{FILE_SEQUENCE}; # count files read
2484
2499
  }
2485
2500
 
@@ -2870,6 +2885,10 @@ sub ExtractInfo($;@)
2870
2885
  # restore necessary members when exiting re-entrant code
2871
2886
  $$self{$_} = $$reEntry{$_} foreach keys %$reEntry;
2872
2887
  SetByteOrder($saveOrder);
2888
+ } elsif ($$self{ImageDataMD5}) {
2889
+ my $digest = $$self{ImageDataMD5}->hexdigest;
2890
+ # (don't store empty digest)
2891
+ $self->FoundTag(ImageDataMD5 => $digest) unless $digest eq 'd41d8cd98f00b204e9800998ecf8427e';
2873
2892
  }
2874
2893
 
2875
2894
  # ($type may be undef without an Error when processing sub-documents)
@@ -4297,9 +4316,9 @@ sub GetFileTime($$)
4297
4316
  # on Windows, try to work around incorrect file times when daylight saving time is in effect
4298
4317
  if ($^O eq 'MSWin32') {
4299
4318
  if (not eval { require Win32::API }) {
4300
- $self->WarnOnce('Install Win32::API for proper handling of Windows file times');
4319
+ $self->WarnOnce('Install Win32::API for proper handling of Windows file times', 1);
4301
4320
  } elsif (not eval { require Win32API::File }) {
4302
- $self->WarnOnce('Install Win32API::File for proper handling of Windows file times');
4321
+ $self->WarnOnce('Install Win32API::File for proper handling of Windows file times', 1);
4303
4322
  } else {
4304
4323
  # get Win32 handle, needed for GetFileTime
4305
4324
  my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
@@ -5868,7 +5887,8 @@ sub ConvertTimeSpan($;$)
5868
5887
  #------------------------------------------------------------------------------
5869
5888
  # Patched timelocal() that fixes ActivePerl timezone bug
5870
5889
  # Inputs/Returns: same as timelocal()
5871
- # Notes: must 'require Time::Local' before calling this routine
5890
+ # Notes: must 'require Time::Local' before calling this routine.
5891
+ # Also note that year should be full year, and not relative to 1900 as with localtime
5872
5892
  sub TimeLocal(@)
5873
5893
  {
5874
5894
  my $tm = Time::Local::timelocal(@_);
@@ -6338,7 +6358,10 @@ sub ProcessJPEG($$)
6338
6358
  my %dumpParms = ( Out => $out );
6339
6359
  my ($success, $wantTrailer, $trailInfo, $foundSOS, %jumbfChunk);
6340
6360
  my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal);
6341
- my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP);
6361
+ my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP, $md5);
6362
+
6363
+ # get pointer to MD5 object if it exists and we are the top-level JPEG
6364
+ $md5 = $$self{ImageDataMD5} if $$self{FILE_TYPE} eq 'JPEG' and not $$self{DOC_NUM};
6342
6365
 
6343
6366
  # check to be sure this is a valid JPG (or J2C, or EXV) file
6344
6367
  return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/;
@@ -6386,7 +6409,9 @@ sub ProcessJPEG($$)
6386
6409
  #
6387
6410
  # read ahead to the next segment unless we have reached EOI, SOS or SOD
6388
6411
  #
6389
- unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer) or $marker==0x93)) {
6412
+ unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer and not $md5) or
6413
+ $marker==0x93))
6414
+ {
6390
6415
  # read up to next marker (JPEG markers begin with 0xff)
6391
6416
  my $buff;
6392
6417
  $raf->ReadLine($buff) or last;
@@ -6416,6 +6441,8 @@ sub ProcessJPEG($$)
6416
6441
  $nextSegPos = $raf->Tell();
6417
6442
  $len -= 4; # subtract size of length word
6418
6443
  last unless $raf->Seek($len, 1);
6444
+ } elsif ($md5 and defined $marker and ($marker == 0x00 or $marker == 0xda)) {
6445
+ $md5->add($buff); # (note: this includes the terminating 0xff's)
6419
6446
  }
6420
6447
  # read second segment too if this was the first
6421
6448
  next unless defined $marker;
@@ -6626,7 +6653,7 @@ sub ProcessJPEG($$)
6626
6653
  next if $trailInfo or $wantTrailer or $verbose > 2 or $htmlDump;
6627
6654
  }
6628
6655
  # must scan to EOI if Validate or JpegCompressionFactor used
6629
- next if $$options{Validate} or $calcImageLen or $$req{trailer};
6656
+ next if $$options{Validate} or $calcImageLen or $$req{trailer} or $md5;
6630
6657
  # nothing interesting to parse after start of scan (SOS)
6631
6658
  $success = 1;
6632
6659
  last; # all done parsing file
@@ -7009,7 +7036,7 @@ sub ProcessJPEG($$)
7009
7036
  $self->FoundTag('PreviewImage', $preview);
7010
7037
  undef $preview;
7011
7038
  }
7012
- } elsif ($marker == 0xe4) { # APP4 (InfiRay, "SCALADO", FPXR, PreviewImage)
7039
+ } elsif ($marker == 0xe4) { # APP4 (InfiRay, "SCALADO", FPXR, DJI, PreviewImage)
7013
7040
  if ($$segDataPt =~ /^SCALADO\0/ and $length >= 16) {
7014
7041
  $dumpType = 'SCALADO';
7015
7042
  my ($num, $idx, $len) = unpack('x8n2N', $$segDataPt);
@@ -7040,6 +7067,16 @@ sub ProcessJPEG($$)
7040
7067
  DirStart(\%dirInfo, 0, 0);
7041
7068
  my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams');
7042
7069
  $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7070
+ } elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^(.{32})?.{32}\x2c\x01\x20\0/s) {
7071
+ $dumpType = 'DJI ThermalParams2';
7072
+ DirStart(\%dirInfo, $1 ? 32 : 0, 0);
7073
+ my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams2');
7074
+ $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7075
+ } elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^.{32}\xaa\x55\x38\0/s) {
7076
+ $dumpType = 'DJI ThermalParams3';
7077
+ DirStart(\%dirInfo, 32, 0);
7078
+ my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams3');
7079
+ $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7043
7080
  } elsif ($$self{HasIJPEG} and $length >= 120) {
7044
7081
  $dumpType = 'InfiRay Factory';
7045
7082
  SetByteOrder('II');
@@ -7153,6 +7190,13 @@ sub ProcessJPEG($$)
7153
7190
  $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7154
7191
  delete $$self{SET_GROUP0};
7155
7192
  delete $$self{SET_GROUP1};
7193
+ } elsif ($$segDataPt =~ /^DJI-DBG\0/) {
7194
+ $dumpType = 'DJI Info';
7195
+ my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::Info');
7196
+ DirStart(\%dirInfo, 8, 0);
7197
+ $$self{SET_GROUP0} = 'APP7';
7198
+ $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7199
+ delete $$self{SET_GROUP0};
7156
7200
  } elsif ($$segDataPt =~ /^\x1aQualcomm Camera Attributes/) {
7157
7201
  # found in HP iPAQ_VoiceMessenger
7158
7202
  $dumpType = 'Qualcomm';
@@ -7681,7 +7725,7 @@ sub DoProcessTIFF($$;$)
7681
7725
  }
7682
7726
  }
7683
7727
  # update FileType if necessary now that we know more about the file
7684
- if ($$self{DNGVersion} and $$self{VALUE}{FileType} !~ /^(DNG|GPR)$/) {
7728
+ if ($$self{DNGVersion} and $$self{FileType} !~ /^(DNG|GPR)$/) {
7685
7729
  # override whatever FileType we set since we now know it is DNG
7686
7730
  $self->OverrideFileType($$self{TIFF_TYPE} = 'DNG');
7687
7731
  }
@@ -8567,7 +8611,7 @@ sub DoEscape($$)
8567
8611
  sub SetFileType($;$$$)
8568
8612
  {
8569
8613
  my ($self, $fileType, $mimeType, $normExt) = @_;
8570
- unless ($$self{VALUE}{FileType} and not $$self{DOC_NUM}) {
8614
+ unless ($$self{FileType} and not $$self{DOC_NUM}) {
8571
8615
  my $baseType = $$self{FILE_TYPE};
8572
8616
  my $ext = $$self{FILE_EXT};
8573
8617
  $fileType or $fileType = $baseType;
@@ -8586,7 +8630,8 @@ sub SetFileType($;$$$)
8586
8630
  $normExt = $fileTypeExt{$fileType};
8587
8631
  $normExt = $fileType unless defined $normExt;
8588
8632
  }
8589
- $$self{FileType} = $fileType;
8633
+ # ($$self{FileType} is the file type of the main document)
8634
+ $$self{FileType} = $fileType unless $$self{DOC_NUM};
8590
8635
  $self->FoundTag('FileType', $fileType);
8591
8636
  $self->FoundTag('FileTypeExtension', uc $normExt);
8592
8637
  $self->FoundTag('MIMEType', $mimeType || 'application/unknown');
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.57
3
+ Version: 12.58
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('12.57.0')
4
+ VERSION = Gem::Version.new('12.58.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.57.0
4
+ version: 12.58.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-02-23 00:00:00.000000000 Z
12
+ date: 2023-03-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool