exiftool_vendored 12.62.0 → 12.64.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 (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
  }