exiftool_vendored 12.62.0 → 12.64.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +50 -1
  3. data/bin/MANIFEST +4 -0
  4. data/bin/META.json +4 -1
  5. data/bin/META.yml +4 -1
  6. data/bin/Makefile.PL +7 -1
  7. data/bin/README +50 -46
  8. data/bin/config_files/guano.config +161 -0
  9. data/bin/exiftool +88 -62
  10. data/bin/lib/Image/ExifTool/7Z.pm +793 -0
  11. data/bin/lib/Image/ExifTool/Apple.pm +6 -3
  12. data/bin/lib/Image/ExifTool/Canon.pm +1 -0
  13. data/bin/lib/Image/ExifTool/CanonRaw.pm +4 -4
  14. data/bin/lib/Image/ExifTool/CanonVRD.pm +4 -1
  15. data/bin/lib/Image/ExifTool/Exif.pm +31 -14
  16. data/bin/lib/Image/ExifTool/FujiFilm.pm +3 -3
  17. data/bin/lib/Image/ExifTool/GPS.pm +5 -2
  18. data/bin/lib/Image/ExifTool/Geotag.pm +4 -1
  19. data/bin/lib/Image/ExifTool/Jpeg2000.pm +226 -28
  20. data/bin/lib/Image/ExifTool/Lang/fr.pm +1467 -202
  21. data/bin/lib/Image/ExifTool/MPF.pm +2 -1
  22. data/bin/lib/Image/ExifTool/Matroska.pm +16 -1
  23. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  24. data/bin/lib/Image/ExifTool/Nikon.pm +419 -5
  25. data/bin/lib/Image/ExifTool/NikonCustom.pm +13 -3
  26. data/bin/lib/Image/ExifTool/PDF.pm +9 -1
  27. data/bin/lib/Image/ExifTool/PLIST.pm +8 -1
  28. data/bin/lib/Image/ExifTool/PNG.pm +6 -6
  29. data/bin/lib/Image/ExifTool/PhaseOne.pm +5 -5
  30. data/bin/lib/Image/ExifTool/QuickTime.pm +74 -21
  31. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -19
  32. data/bin/lib/Image/ExifTool/README +2 -2
  33. data/bin/lib/Image/ExifTool/RIFF.pm +11 -9
  34. data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  35. data/bin/lib/Image/ExifTool/SigmaRaw.pm +4 -4
  36. data/bin/lib/Image/ExifTool/Sony.pm +103 -8
  37. data/bin/lib/Image/ExifTool/TagLookup.pm +4738 -4630
  38. data/bin/lib/Image/ExifTool/TagNames.pod +249 -5
  39. data/bin/lib/Image/ExifTool/Validate.pm +17 -1
  40. data/bin/lib/Image/ExifTool/WriteExif.pl +9 -7
  41. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +21 -9
  42. data/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
  43. data/bin/lib/Image/ExifTool/Writer.pl +28 -10
  44. data/bin/lib/Image/ExifTool/XMP.pm +14 -2
  45. data/bin/lib/Image/ExifTool/XMP2.pl +32 -0
  46. data/bin/lib/Image/ExifTool/XMPStruct.pl +96 -28
  47. data/bin/lib/Image/ExifTool/ZIP.pm +5 -5
  48. data/bin/lib/Image/ExifTool.pm +67 -39
  49. data/bin/lib/Image/ExifTool.pod +83 -52
  50. data/bin/perl-Image-ExifTool.spec +44 -44
  51. data/lib/exiftool_vendored/version.rb +1 -1
  52. metadata +4 -2
@@ -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.63';
39
+ $VERSION = '1.64';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -1374,7 +1374,7 @@ sub ProcessPNG($$)
1374
1374
  my $datCount = 0;
1375
1375
  my $datBytes = 0;
1376
1376
  my $fastScan = $et->Options('FastScan');
1377
- my $md5 = $$et{ImageDataMD5};
1377
+ my $hash = $$et{ImageDataHash};
1378
1378
  my ($n, $sig, $err, $hbuf, $dbuf, $cbuf);
1379
1379
  my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset);
1380
1380
 
@@ -1454,7 +1454,7 @@ sub ProcessPNG($$)
1454
1454
  if ($datCount and $chunk ne $datChunk) {
1455
1455
  my $s = $datCount > 1 ? 's' : '';
1456
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;
1457
+ print $out "$$et{INDENT}(ImageDataHash: $datBytes bytes of $datChunk data)\n" if $hash;
1458
1458
  $datCount = $datBytes = 0;
1459
1459
  }
1460
1460
  }
@@ -1541,8 +1541,8 @@ sub ProcessPNG($$)
1541
1541
  }
1542
1542
  # skip over data chunks if possible/necessary
1543
1543
  } elsif (not $validate or $len > $chunkSizeLimit) {
1544
- if ($md5) {
1545
- $et->ImageDataMD5($raf, $len);
1544
+ if ($hash) {
1545
+ $et->ImageDataHash($raf, $len);
1546
1546
  $raf->Read($cbuf, 4) == 4 or $et->Warn('Truncated data'), last;
1547
1547
  } else {
1548
1548
  $raf->Seek($len + 4, 1) or $et->Warn('Seek error'), last;
@@ -1565,7 +1565,7 @@ sub ProcessPNG($$)
1565
1565
  $et->Warn("Corrupted $fileType image") unless $wasEnd;
1566
1566
  last;
1567
1567
  }
1568
- $md5->add($dbuf) if $md5 and $datChunk; # add to MD5 if necessary
1568
+ $hash->add($dbuf) if $hash and $datChunk; # add to hash if necessary
1569
1569
  if ($verbose or $validate or ($outfile and not $fastScan)) {
1570
1570
  # check CRC when in verbose mode (since we don't care about speed)
1571
1571
  my $crc = CalculateCRC(\$hbuf, undef, 4);
@@ -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.08';
18
+ $VERSION = '1.09';
19
19
 
20
20
  sub WritePhaseOne($$$);
21
21
  sub ProcessPhaseOne($$$);
@@ -585,7 +585,7 @@ sub ProcessPhaseOne($$$)
585
585
  my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
586
586
  my $binary = $et->Options('Binary');
587
587
  my $verbose = $et->Options('Verbose');
588
- my $md5 = $$et{ImageDataMD5};
588
+ my $hash = $$et{ImageDataHash};
589
589
  my $htmlDump = $$et{HTML_DUMP};
590
590
 
591
591
  return 0 if $dirLen < 12;
@@ -678,16 +678,16 @@ sub ProcessPhaseOne($$$)
678
678
  }
679
679
  }
680
680
  }
681
- if ($md5 and $tagInfo and $$tagInfo{IsImageData}) {
681
+ if ($hash and $tagInfo and $$tagInfo{IsImageData}) {
682
682
  my ($pos, $len) = ($valuePtr, $size);
683
683
  while ($len) {
684
684
  my $n = $len > 65536 ? 65536 : $len;
685
685
  my $tmp = substr($$dataPt, $pos, $n);
686
- $md5->add($tmp);
686
+ $hash->add($tmp);
687
687
  $len -= $n;
688
688
  $pos += $n;
689
689
  }
690
- $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $size bytes of PhaseOne:$$tagInfo{Name})\n");
690
+ $et->VPrint(0, "$$et{INDENT}(ImageDataHash: $size bytes of PhaseOne:$$tagInfo{Name})\n");
691
691
  }
692
692
  my %parms = (
693
693
  DirName => $ifdType,
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
47
47
  use Image::ExifTool::Exif;
48
48
  use Image::ExifTool::GPS;
49
49
 
50
- $VERSION = '2.85';
50
+ $VERSION = '2.86';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -224,6 +224,9 @@ my %ftypLookup = (
224
224
  'crx ' => 'Canon Raw (.CRX)', #PH (CR3 or CRM; use Canon CompressorVersion to decide)
225
225
  );
226
226
 
227
+ # use extension to determine file type
228
+ my %useExt = ( GLV => 'MP4' );
229
+
227
230
  # information for int32u date/time tags (time zero is Jan 1, 1904)
228
231
  my %timeInfo = (
229
232
  Notes => 'converted from UTC to local time if the QuickTimeUTC option is set',
@@ -447,8 +450,8 @@ my %dupDirOK = ( ipco => 1, '----' => 1 );
447
450
  my %eeStd = ( stco => 'stbl', co64 => 'stbl', stsz => 'stbl', stz2 => 'stbl',
448
451
  stsc => 'stbl', stts => 'stbl' );
449
452
 
450
- # atoms required for generating ImageDataMD5
451
- my %md5Box = ( vide => { %eeStd }, soun => { %eeStd } );
453
+ # atoms required for generating ImageDataHash
454
+ my %hashBox = ( vide => { %eeStd }, soun => { %eeStd } );
452
455
 
453
456
  # boxes and their containers for the various handler types that we want to save
454
457
  # when the ExtractEmbedded is enabled (currently only the 'gps ' container name is
@@ -1006,7 +1009,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
1006
1009
  0 => 'Monoscopic',
1007
1010
  1 => 'Stereoscopic Top-Bottom',
1008
1011
  2 => 'Stereoscopic Left-Right',
1009
- 3 => 'Stereoscopic Stereo-Custom', # (provisional in spec as of 2017-10-10)
1012
+ 3 => 'Stereoscopic Stereo-Custom',
1013
+ 4 => 'Stereoscopic Right-Left',
1010
1014
  },
1011
1015
  },
1012
1016
  sv3d => {
@@ -2070,8 +2074,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2070
2074
  ValueConv => 'substr($val, 4)',
2071
2075
  ValueConvInv => '"\0\0\0\x01$val"',
2072
2076
  },
2073
- # hmtp - "\0\0\0\x01" followed by 408 bytes of zero
2074
- # vrin - "\0\0\0\x01" followed by 8 bytes of zero
2077
+ # hmtp - 412 bytes: "\0\0\0\x01" then maybe "\0\0\0\x64" and the rest zeros
2078
+ # vrin - 12 bytes: "\0\0\0\x01" followed by 8 bytes of zero
2075
2079
  # ---- GoPro ---- (ref PH)
2076
2080
  GoPr => 'GoProType', # (Hero3+)
2077
2081
  FIRM => { Name => 'FirmwareVersion', Avoid => 1 }, # (Hero4)
@@ -2867,6 +2871,25 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2867
2871
  Name => 'AV1Configuration',
2868
2872
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AV1Config' },
2869
2873
  },
2874
+ clli => {
2875
+ Name => 'ContentLightLevel',
2876
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ContentLightLevel' },
2877
+ },
2878
+ # ref https://nokiatech.github.io/heif/technical.html
2879
+ # cclv - Content Color Volume
2880
+ # mdcv - Mastering Display Color Volume
2881
+ # rrtp - Required reference types
2882
+ # crtt - Creation time information
2883
+ # mdft - Modification time information
2884
+ # udes - User description
2885
+ # altt - Accessibility text
2886
+ # aebr - Auto exposure information
2887
+ # wbbr - White balance information
2888
+ # fobr - Focus information
2889
+ # afbr - Flash exposure information
2890
+ # dobr - Depth of field information
2891
+ # pano - Panorama information
2892
+ # iscl - Image Scaling
2870
2893
  );
2871
2894
 
2872
2895
  # ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
@@ -2901,8 +2924,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2901
2924
  1 => 'BT.709',
2902
2925
  2 => 'Unspecified',
2903
2926
  3 => 'For future use (3)',
2904
- 4 => 'BT.470 System M (historical)',
2905
- 5 => 'BT.470 System B, G (historical)',
2927
+ 4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
2928
+ 5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
2906
2929
  6 => 'BT.601',
2907
2930
  7 => 'SMPTE 240 M',
2908
2931
  8 => 'Linear',
@@ -3128,6 +3151,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
3128
3151
  },
3129
3152
  );
3130
3153
 
3154
+ # ref https://android.googlesource.com/platform/frameworks/av/+/master/media/libstagefright/MPEG4Writer.cpp
3155
+ %Image::ExifTool::QuickTime::ContentLightLevel = (
3156
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3157
+ GROUPS => { 2 => 'Video' },
3158
+ FIRST_ENTRY => 0,
3159
+ FORMAT => 'int16u',
3160
+ 0 => 'MaxContentLightLevel',
3161
+ 1 => 'MaxPicAverageLightLevel',
3162
+ );
3163
+
3131
3164
  %Image::ExifTool::QuickTime::ItemRef = (
3132
3165
  PROCESS_PROC => \&ProcessMOV,
3133
3166
  WRITE_PROC => \&WriteQuickTime,
@@ -7187,7 +7220,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
7187
7220
  #
7188
7221
  # AudioFormat Offset Child atoms
7189
7222
  # ----------- ------ ----------------
7190
- # mp4a 52 * wave, chan, esds, SA3D(Insta360 spherical video params?,also GoPro Max)
7223
+ # mp4a 52 * wave, chan, esds, SA3D(Insta360 spherical video params?,also GoPro Max and Garmin VIRB 360)
7191
7224
  # in24 52 wave, chan
7192
7225
  # "ms\0\x11" 52 wave
7193
7226
  # sowt 52 chan
@@ -7220,11 +7253,14 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
7220
7253
  chan => {
7221
7254
  Name => 'AudioChannelLayout',
7222
7255
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ChannelLayout' },
7223
- }
7256
+ },
7257
+ SA3D => { # written by Garmin VIRB360
7258
+ Name => 'SpatialAudio',
7259
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SpatialAudio' },
7260
+ },
7224
7261
  # alac - 28 bytes
7225
7262
  # adrm - AAX DRM atom? 148 bytes
7226
7263
  # aabd - AAX unknown 17kB (contains 'aavd' strings)
7227
- # SA3D - written by Garmin VIRB360
7228
7264
  );
7229
7265
 
7230
7266
  # AMR decode config box (ref 3)
@@ -7572,6 +7608,20 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
7572
7608
  # (arbitrarily decode only first 8 channels)
7573
7609
  );
7574
7610
 
7611
+ # spatial audio (ref https://github.com/google/spatial-media/blob/master/docs/spatial-audio-rfc.md)
7612
+ %Image::ExifTool::QuickTime::SpatialAudio = (
7613
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
7614
+ GROUPS => { 2 => 'Audio' },
7615
+ NOTES => 'Spatial Audio tags.',
7616
+ 0 => 'SpatialAudioVersion',
7617
+ 1 => { Name => 'AmbisonicType', PrintConv => { 0 => 'Periphonic' } },
7618
+ 2 => { Name => 'AmbisonicOrder', Format => 'int32u' },
7619
+ 6 => { Name => 'AmbisonicChannelOrdering', PrintConv => { 0 => 'ACN' } },
7620
+ 7 => { Name => 'AmbisonicNormalization', PrintConv => { 0 => 'SN3D' } },
7621
+ 8 => { Name => 'AmbisonicChannels', Format => 'int32u' },
7622
+ 12 => { Name => 'AmbisonicChannelMap', Format => 'int32u[$val{8}]' },
7623
+ );
7624
+
7575
7625
  # scheme type atom
7576
7626
  # ref http://xhelmboyx.tripod.com/formats/mp4-layout.txt
7577
7627
  %Image::ExifTool::QuickTime::SchemeType = (
@@ -8787,15 +8837,15 @@ sub HandleItemInfo($)
8787
8837
  $et->VPrint(0, "$$et{INDENT} [snip $snip bytes]\n") if $snip;
8788
8838
  }
8789
8839
  }
8790
- # do MD5 checksum of AVIF "av01" and HEIC image data
8791
- if ($isImageData{$type} and $$et{ImageDataMD5}) {
8792
- my $md5 = $$et{ImageDataMD5};
8840
+ # do hash of AVIF "av01" and HEIC image data
8841
+ if ($isImageData{$type} and $$et{ImageDataHash}) {
8842
+ my $hash = $$et{ImageDataHash};
8793
8843
  my $tot = 0;
8794
8844
  foreach $extent (@{$$item{Extents}}) {
8795
8845
  $raf->Seek($$extent[1] + $base, 0) or $et->Warn("Seek error in $type image data"), last;
8796
- $tot += $et->ImageDataMD5($raf, $$extent[2], "$type image", 1);
8846
+ $tot += $et->ImageDataHash($raf, $$extent[2], "$type image", 1);
8797
8847
  }
8798
- $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $tot bytes of $type data)\n") if $tot;
8848
+ $et->VPrint(0, "$$et{INDENT}(ImageDataHash: $tot bytes of $type data)\n") if $tot;
8799
8849
  }
8800
8850
  next unless $name;
8801
8851
  # assemble the data for this item
@@ -9285,6 +9335,9 @@ sub ProcessMOV($$;$)
9285
9335
  }
9286
9336
  }
9287
9337
  $fileType or $fileType = 'MP4'; # default to MP4
9338
+ # set file type from extension if appropriate
9339
+ my $ext = $$et{FILE_EXT};
9340
+ $fileType = $ext if $ext and $useExt{$ext} and $fileType eq $useExt{$ext};
9288
9341
  $et->SetFileType($fileType, $mimeLookup{$fileType} || 'video/mp4');
9289
9342
  # temporarily set ExtractEmbedded option for CRX files
9290
9343
  $saveOptions{ExtractEmbedded} = $et->Options(ExtractEmbedded => 1) if $fileType eq 'CRX';
@@ -9299,8 +9352,8 @@ sub ProcessMOV($$;$)
9299
9352
  $$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
9300
9353
 
9301
9354
  my $ee = $$et{OPTIONS}{ExtractEmbedded};
9302
- my $md5 = $$et{ImageDataMD5};
9303
- if ($ee or $md5) {
9355
+ my $hash = $$et{ImageDataHash};
9356
+ if ($ee or $hash) {
9304
9357
  $unkOpt = $$et{OPTIONS}{Unknown};
9305
9358
  require 'Image/ExifTool/QuickTimeStream.pl';
9306
9359
  }
@@ -9382,7 +9435,7 @@ sub ProcessMOV($$;$)
9382
9435
  # set flag to store additional information for ExtractEmbedded option
9383
9436
  my $handlerType = $$et{HandlerType};
9384
9437
  if ($eeBox{$handlerType} and $eeBox{$handlerType}{$tag}) {
9385
- if ($ee or $md5) {
9438
+ if ($ee or $hash) {
9386
9439
  # (there is another 'gps ' box with a track log that doesn't contain offsets)
9387
9440
  if ($tag ne 'gps ' or $eeBox{$handlerType}{$tag} eq $dirID) {
9388
9441
  $eeTag = 1;
@@ -9394,7 +9447,7 @@ sub ProcessMOV($$;$)
9394
9447
  } elsif ($ee and $ee > 1 and $eeBox2{$handlerType} and $eeBox2{$handlerType}{$tag}) {
9395
9448
  $eeTag = 1;
9396
9449
  $$et{OPTIONS}{Unknown} = 1;
9397
- } elsif ($md5 and $md5Box{$handlerType} and $md5Box{$handlerType}{$tag}) {
9450
+ } elsif ($hash and $hashBox{$handlerType} and $hashBox{$handlerType}{$tag}) {
9398
9451
  $eeTag = 1;
9399
9452
  $$et{OPTIONS}{Unknown} = 1;
9400
9453
  }
@@ -9629,7 +9682,7 @@ ItemID: foreach $id (keys %$items) {
9629
9682
  }
9630
9683
  if ($tag eq 'stbl') {
9631
9684
  # process sample data when exiting SampleTable box if extracting embedded
9632
- ProcessSamples($et) if $ee or $md5;
9685
+ ProcessSamples($et) if $ee or $hash;
9633
9686
  } elsif ($tag eq 'minf') {
9634
9687
  $$et{HandlerType} = ''; # reset handler type at end of media info box
9635
9688
  }
@@ -1128,14 +1128,14 @@ sub Process_text($$$;$)
1128
1128
  # Inputs: 0) ExifTool ref
1129
1129
  # Notes: Also accesses ExifTool RAF*, SET_GROUP1, HandlerType, MetaFormat,
1130
1130
  # ee*, and avcC elements (* = must exist)
1131
- # - may be called either due to ExtractEmbedded option, or ImageDataMD5 requested
1132
- # - MD5 includes only video and audio data
1131
+ # - may be called either due to ExtractEmbedded option, or ImageDataHash requested
1132
+ # - hash includes only video and audio data
1133
1133
  sub ProcessSamples($)
1134
1134
  {
1135
1135
  my $et = shift;
1136
1136
  my ($raf, $ee) = @$et{qw(RAF ee)};
1137
- my ($i, $buff, $pos, $hdrLen, $hdrFmt, @time, @dur, $oldIndent, $md5);
1138
- my ($mdatOffset, $mdatSize); # (for range-checking samples when MD5 is done)
1137
+ my ($i, $buff, $pos, $hdrLen, $hdrFmt, @time, @dur, $oldIndent, $hash);
1138
+ my ($mdatOffset, $mdatSize); # (for range-checking samples when hash is done)
1139
1139
 
1140
1140
  return unless $ee;
1141
1141
  delete $$et{ee}; # use only once
@@ -1144,22 +1144,22 @@ sub ProcessSamples($)
1144
1144
  my $type = $$et{HandlerType} || '';
1145
1145
  if ($type eq 'vide') {
1146
1146
  # only process specific types of video streams
1147
- $md5 = $$et{ImageDataMD5};
1147
+ $hash = $$et{ImageDataHash};
1148
1148
  # only process specific video types if ExtractEmbedded was used
1149
- # (otherwise we are only here to calculate the audio/video MD5)
1149
+ # (otherwise we are only here to calculate the audio/video hash)
1150
1150
  if ($eeOpt) {
1151
1151
  if ($$ee{avcC}) { $type = 'avcC' }
1152
1152
  elsif ($$ee{JPEG}) { $type = 'JPEG' }
1153
- else { return unless $md5 }
1153
+ else { return unless $hash }
1154
1154
  }
1155
1155
  } elsif ($type eq 'soun') {
1156
- $md5 = $$et{ImageDataMD5};
1157
- return unless $md5;
1156
+ $hash = $$et{ImageDataHash};
1157
+ return unless $hash;
1158
1158
  } else {
1159
- return unless $eeOpt; # (don't do MD5 on other types)
1159
+ return unless $eeOpt; # (don't do hash on other types)
1160
1160
  }
1161
1161
 
1162
- my $md5size = 0;
1162
+ my $hashSize = 0;
1163
1163
  my ($start, $size) = @$ee{qw(start size)};
1164
1164
  #
1165
1165
  # determine sample start offsets from chunk offsets (stco) and sample-to-chunk table (stsc),
@@ -1213,7 +1213,7 @@ Sample: for ($i=0; ; ) {
1213
1213
  ++$iChunk;
1214
1214
  }
1215
1215
  @$start == @$size or $et->WarnOnce('Incorrect sample start/size count'), return;
1216
- # process as chunks if we are only interested in calculating MD5
1216
+ # process as chunks if we are only interested in calculating hash
1217
1217
  if ($type eq 'soun' or $type eq 'vide') {
1218
1218
  $start = $stco;
1219
1219
  $size = \@chunkSize;
@@ -1232,7 +1232,7 @@ Sample: for ($i=0; ; ) {
1232
1232
  $oldIndent = $$et{INDENT};
1233
1233
  $$et{INDENT} = '';
1234
1234
  }
1235
- if ($md5) {
1235
+ if ($hash) {
1236
1236
  $mdatSize = $$et{MediaDataSize};
1237
1237
  $mdatOffset = $$et{MediaDataOffset} if defined $mdatSize;
1238
1238
  }
@@ -1249,7 +1249,7 @@ Sample: for ($i=0; ; ) {
1249
1249
  delete $$et{FoundGPSLatitude};
1250
1250
  delete $$et{FoundGPSDateTime};
1251
1251
 
1252
- # range check the sample data for MD5 if necessary
1252
+ # range check the sample data for hash if necessary
1253
1253
  my $size = $$size[$i];
1254
1254
  if (defined $mdatOffset) {
1255
1255
  if ($$start[$i] < $mdatOffset) {
@@ -1268,9 +1268,9 @@ Sample: for ($i=0; ; ) {
1268
1268
  next unless $n;
1269
1269
  $size = $n;
1270
1270
  }
1271
- if ($md5) {
1272
- $md5->add($buff);
1273
- $md5size += length $buff;
1271
+ if ($hash) {
1272
+ $hash->add($buff);
1273
+ $hashSize += length $buff;
1274
1274
  }
1275
1275
  if ($type eq 'avcC') {
1276
1276
  next if length($buff) <= $hdrLen;
@@ -1378,7 +1378,7 @@ Sample: for ($i=0; ; ) {
1378
1378
  DataPos => $$start[$i],
1379
1379
  SampleTime => $time[$i],
1380
1380
  SampleDuration => $dur[$i],
1381
- }, $tagTbl) ;
1381
+ }, $tagTbl);
1382
1382
  }
1383
1383
 
1384
1384
  } elsif ($$tagTbl{$type}) {
@@ -1399,7 +1399,7 @@ Sample: for ($i=0; ; ) {
1399
1399
  }
1400
1400
  if ($verbose) {
1401
1401
  my $str = $type eq 'soun' ? 'Audio' : 'Video';
1402
- $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $md5size bytes of $str data)\n") if $md5size;
1402
+ $et->VPrint(0, "$$et{INDENT}(ImageDataHash: $hashSize bytes of $str data)\n") if $hashSize;
1403
1403
  $$et{INDENT} = $oldIndent;
1404
1404
  $et->VPrint(0, "--------------------------\n");
1405
1405
  }
@@ -2904,6 +2904,7 @@ sub ProcessInsta360($;$)
2904
2904
  # when the language is french? ie. "Ouest"?)
2905
2905
  $a[7] eq 'O'))
2906
2906
  {
2907
+ next if $a[3] eq 'V'; # void fixes don't have N/S E/W
2907
2908
  $et->Warn('Unrecognized INSV GPS format');
2908
2909
  last;
2909
2910
  }
@@ -412,7 +412,7 @@ numerical, and generated automatically otherwise.
412
412
  'IsComposite' - flag set for Composite tags
413
413
 
414
414
  'IsImageData' - flag set if this is an image data offset to
415
- be included in ImageDataMD5 calculation. Must have an
415
+ be included in ImageDataHash calculation. Must have an
416
416
  OffsetPair entry which is the ID of the corresponding size.
417
417
 
418
418
  'IsOffset' - flag set if the tag represents an offset to some
@@ -637,7 +637,7 @@ numerical, and generated automatically otherwise.
637
637
  RawConv instead to return undef if it is necessary to test the
638
638
  value for validity, otherwise an undef tag may hide a
639
639
  previously defined value when the Duplicates option is not
640
- enabled. If this isn't possible (as with Composite tags where
640
+ enabled. If this isn't possible (as with Composite tags where
641
641
  the converted values of the source tags are needed), set the
642
642
  Priority to 0 to avoid taking priority over a valid tag. If
643
643
  ValueConv is not specified, the Raw value is not converted.
@@ -30,7 +30,7 @@ use strict;
30
30
  use vars qw($VERSION $AUTOLOAD);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
 
33
- $VERSION = '1.64';
33
+ $VERSION = '1.65';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -38,7 +38,7 @@ sub ProcessSLLT($$$);
38
38
  sub ProcessLucas($$$);
39
39
  sub WriteRIFF($$);
40
40
 
41
- # RIFF chunks containing image data (to include in ImageDataMD5 digest)
41
+ # RIFF chunks containing image data (to include in ImageDataHash digest)
42
42
  my %isImageData = (
43
43
  LIST_movi => 1, # (AVI: contains ##db, ##dc, ##wb)
44
44
  data => 1, # (WAV)
@@ -652,6 +652,7 @@ my %code2charset = (
652
652
  Name => 'Acidizer',
653
653
  SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Acidizer' },
654
654
  },
655
+ guan => 'Guano', #forum14831
655
656
  );
656
657
 
657
658
  # the maker notes used by some digital cameras
@@ -1987,7 +1988,7 @@ sub ProcessRIFF($$)
1987
1988
  my $unknown = $et->Options('Unknown');
1988
1989
  my $validate = $et->Options('Validate');
1989
1990
  my $ee = $et->Options('ExtractEmbedded');
1990
- my $md5 = $$et{ImageDataMD5};
1991
+ my $hash = $$et{ImageDataHash};
1991
1992
 
1992
1993
  # verify this is a valid RIFF file
1993
1994
  return 0 unless $raf->Read($buff, 12) == 12;
@@ -2045,6 +2046,7 @@ sub ProcessRIFF($$)
2045
2046
  } else {
2046
2047
  next;
2047
2048
  }
2049
+ last;
2048
2050
  }
2049
2051
  # stop when we hit the audio data or AVI index or AVI movie data
2050
2052
  # --> no more because Adobe Bridge stores XMP after this!!
@@ -2067,9 +2069,9 @@ sub ProcessRIFF($$)
2067
2069
  # (in LIST_movi chunk: ##db = uncompressed DIB, ##dc = compressed DIB, ##wb = audio data)
2068
2070
  if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
2069
2071
  $raf->Read($buff, $len2) == $len2 or $err=1, last;
2070
- if ($md5 and $isImageData{$tag}) {
2071
- $md5->add($buff);
2072
- $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: '${tag}' chunk, $len2 bytes)\n");
2072
+ if ($hash and $isImageData{$tag}) {
2073
+ $hash->add($buff);
2074
+ $et->VPrint(0, "$$et{INDENT}(ImageDataHash: '${tag}' chunk, $len2 bytes)\n");
2073
2075
  }
2074
2076
  my $setGroups;
2075
2077
  if ($tagInfo and ref $tagInfo eq 'HASH' and $$tagInfo{SetGroups}) {
@@ -2099,10 +2101,10 @@ sub ProcessRIFF($$)
2099
2101
  next; # (must not increment $pos)
2100
2102
  } else {
2101
2103
  my $rewind;
2102
- # do MD5 if required
2103
- if ($md5 and $isImageData{$tag}) {
2104
+ # do hash if required
2105
+ if ($hash and $isImageData{$tag}) {
2104
2106
  $rewind = $raf->Tell();
2105
- $et->ImageDataMD5($raf, $len2, "'${tag}' chunk");
2107
+ $et->ImageDataHash($raf, $len2, "'${tag}' chunk");
2106
2108
  }
2107
2109
  if ($tag eq 'LIST_movi' and $ee) {
2108
2110
  $raf->Seek($rewind, 0) or $err = 1, last if $rewind;
@@ -19,7 +19,7 @@ package Image::ExifTool::Shortcuts;
19
19
  use strict;
20
20
  use vars qw($VERSION);
21
21
 
22
- $VERSION = '1.67';
22
+ $VERSION = '1.68';
23
23
 
24
24
  # this is a special table used to define command-line shortcuts
25
25
  # (documentation Notes may be added for these via %shortcutNotes in BuildTagLookup.pm)
@@ -276,6 +276,7 @@ $VERSION = '1.67';
276
276
  'FileModifyDate',
277
277
  'FileName',
278
278
  ],
279
+ ImageDataMD5 => [ 'ImageDataHash' ], # (for backward compatibilty)
279
280
  );
280
281
 
281
282
  #------------------------------------------------------------------------------
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::Sigma;
18
18
 
19
- $VERSION = '1.30';
19
+ $VERSION = '1.31';
20
20
 
21
21
  sub ProcessX3FHeader($$$);
22
22
  sub ProcessX3FDirectory($$$);
@@ -549,9 +549,9 @@ sub ProcessX3FDirectory($$$)
549
549
  $len -= 28;
550
550
  # ignore all image data but JPEG compressed (version 2.0, type 2, format 18)
551
551
  unless ($buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/) {
552
- # do MD5 on non-preview data if requested
553
- if ($$et{ImageDataMD5} and substr($buff,8,1) ne "\x02") {
554
- $et->ImageDataMD5($raf, $len, 'SigmaRaw IMAG');
552
+ # do hash on non-preview data if requested
553
+ if ($$et{ImageDataHash} and substr($buff,8,1) ne "\x02") {
554
+ $et->ImageDataHash($raf, $len, 'SigmaRaw IMAG');
555
555
  }
556
556
  next;
557
557
  }