exiftool_vendored 12.62.0 → 12.63.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 +29 -1
  3. data/bin/MANIFEST +1 -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 +10 -7
  8. data/bin/exiftool +22 -16
  9. data/bin/lib/Image/ExifTool/7Z.pm +793 -0
  10. data/bin/lib/Image/ExifTool/Canon.pm +1 -0
  11. data/bin/lib/Image/ExifTool/CanonRaw.pm +4 -4
  12. data/bin/lib/Image/ExifTool/Exif.pm +31 -14
  13. data/bin/lib/Image/ExifTool/FujiFilm.pm +3 -3
  14. data/bin/lib/Image/ExifTool/GPS.pm +5 -2
  15. data/bin/lib/Image/ExifTool/Geotag.pm +4 -1
  16. data/bin/lib/Image/ExifTool/Jpeg2000.pm +225 -28
  17. data/bin/lib/Image/ExifTool/MPF.pm +2 -1
  18. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  19. data/bin/lib/Image/ExifTool/PNG.pm +6 -6
  20. data/bin/lib/Image/ExifTool/PhaseOne.pm +5 -5
  21. data/bin/lib/Image/ExifTool/QuickTime.pm +41 -12
  22. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +18 -18
  23. data/bin/lib/Image/ExifTool/README +1 -1
  24. data/bin/lib/Image/ExifTool/RIFF.pm +11 -9
  25. data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  26. data/bin/lib/Image/ExifTool/SigmaRaw.pm +4 -4
  27. data/bin/lib/Image/ExifTool/Sony.pm +102 -8
  28. data/bin/lib/Image/ExifTool/TagLookup.pm +982 -953
  29. data/bin/lib/Image/ExifTool/TagNames.pod +75 -5
  30. data/bin/lib/Image/ExifTool/Validate.pm +17 -1
  31. data/bin/lib/Image/ExifTool/WriteExif.pl +9 -7
  32. data/bin/lib/Image/ExifTool/Writer.pl +7 -6
  33. data/bin/lib/Image/ExifTool/XMP.pm +14 -2
  34. data/bin/lib/Image/ExifTool/XMP2.pl +32 -0
  35. data/bin/lib/Image/ExifTool/ZIP.pm +5 -5
  36. data/bin/lib/Image/ExifTool.pm +54 -33
  37. data/bin/lib/Image/ExifTool.pod +17 -6
  38. data/bin/perl-Image-ExifTool.spec +6 -6
  39. data/lib/exiftool_vendored/version.rb +1 -1
  40. metadata +3 -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,
@@ -447,8 +447,8 @@ my %dupDirOK = ( ipco => 1, '----' => 1 );
447
447
  my %eeStd = ( stco => 'stbl', co64 => 'stbl', stsz => 'stbl', stz2 => 'stbl',
448
448
  stsc => 'stbl', stts => 'stbl' );
449
449
 
450
- # atoms required for generating ImageDataMD5
451
- my %md5Box = ( vide => { %eeStd }, soun => { %eeStd } );
450
+ # atoms required for generating ImageDataHash
451
+ my %hashBox = ( vide => { %eeStd }, soun => { %eeStd } );
452
452
 
453
453
  # boxes and their containers for the various handler types that we want to save
454
454
  # when the ExtractEmbedded is enabled (currently only the 'gps ' container name is
@@ -2867,6 +2867,25 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2867
2867
  Name => 'AV1Configuration',
2868
2868
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AV1Config' },
2869
2869
  },
2870
+ clli => {
2871
+ Name => 'ContentLightLevel',
2872
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ContentLightLevel' },
2873
+ },
2874
+ # ref https://nokiatech.github.io/heif/technical.html
2875
+ # cclv - Content Color Volume
2876
+ # mdcv - Mastering Display Color Volume
2877
+ # rrtp - Required reference types
2878
+ # crtt - Creation time information
2879
+ # mdft - Modification time information
2880
+ # udes - User description
2881
+ # altt - Accessibility text
2882
+ # aebr - Auto exposure information
2883
+ # wbbr - White balance information
2884
+ # fobr - Focus information
2885
+ # afbr - Flash exposure information
2886
+ # dobr - Depth of field information
2887
+ # pano - Panorama information
2888
+ # iscl - Image Scaling
2870
2889
  );
2871
2890
 
2872
2891
  # ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
@@ -3128,6 +3147,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
3128
3147
  },
3129
3148
  );
3130
3149
 
3150
+ # ref https://android.googlesource.com/platform/frameworks/av/+/master/media/libstagefright/MPEG4Writer.cpp
3151
+ %Image::ExifTool::QuickTime::ContentLightLevel = (
3152
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3153
+ GROUPS => { 2 => 'Video' },
3154
+ FIRST_ENTRY => 0,
3155
+ FORMAT => 'int16u',
3156
+ 0 => 'MaxContentLightLevel',
3157
+ 1 => 'MaxPicAverageLightLevel',
3158
+ );
3159
+
3131
3160
  %Image::ExifTool::QuickTime::ItemRef = (
3132
3161
  PROCESS_PROC => \&ProcessMOV,
3133
3162
  WRITE_PROC => \&WriteQuickTime,
@@ -8787,15 +8816,15 @@ sub HandleItemInfo($)
8787
8816
  $et->VPrint(0, "$$et{INDENT} [snip $snip bytes]\n") if $snip;
8788
8817
  }
8789
8818
  }
8790
- # do MD5 checksum of AVIF "av01" and HEIC image data
8791
- if ($isImageData{$type} and $$et{ImageDataMD5}) {
8792
- my $md5 = $$et{ImageDataMD5};
8819
+ # do hash of AVIF "av01" and HEIC image data
8820
+ if ($isImageData{$type} and $$et{ImageDataHash}) {
8821
+ my $hash = $$et{ImageDataHash};
8793
8822
  my $tot = 0;
8794
8823
  foreach $extent (@{$$item{Extents}}) {
8795
8824
  $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);
8825
+ $tot += $et->ImageDataHash($raf, $$extent[2], "$type image", 1);
8797
8826
  }
8798
- $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $tot bytes of $type data)\n") if $tot;
8827
+ $et->VPrint(0, "$$et{INDENT}(ImageDataHash: $tot bytes of $type data)\n") if $tot;
8799
8828
  }
8800
8829
  next unless $name;
8801
8830
  # assemble the data for this item
@@ -9299,8 +9328,8 @@ sub ProcessMOV($$;$)
9299
9328
  $$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
9300
9329
 
9301
9330
  my $ee = $$et{OPTIONS}{ExtractEmbedded};
9302
- my $md5 = $$et{ImageDataMD5};
9303
- if ($ee or $md5) {
9331
+ my $hash = $$et{ImageDataHash};
9332
+ if ($ee or $hash) {
9304
9333
  $unkOpt = $$et{OPTIONS}{Unknown};
9305
9334
  require 'Image/ExifTool/QuickTimeStream.pl';
9306
9335
  }
@@ -9382,7 +9411,7 @@ sub ProcessMOV($$;$)
9382
9411
  # set flag to store additional information for ExtractEmbedded option
9383
9412
  my $handlerType = $$et{HandlerType};
9384
9413
  if ($eeBox{$handlerType} and $eeBox{$handlerType}{$tag}) {
9385
- if ($ee or $md5) {
9414
+ if ($ee or $hash) {
9386
9415
  # (there is another 'gps ' box with a track log that doesn't contain offsets)
9387
9416
  if ($tag ne 'gps ' or $eeBox{$handlerType}{$tag} eq $dirID) {
9388
9417
  $eeTag = 1;
@@ -9394,7 +9423,7 @@ sub ProcessMOV($$;$)
9394
9423
  } elsif ($ee and $ee > 1 and $eeBox2{$handlerType} and $eeBox2{$handlerType}{$tag}) {
9395
9424
  $eeTag = 1;
9396
9425
  $$et{OPTIONS}{Unknown} = 1;
9397
- } elsif ($md5 and $md5Box{$handlerType} and $md5Box{$handlerType}{$tag}) {
9426
+ } elsif ($hash and $hashBox{$handlerType} and $hashBox{$handlerType}{$tag}) {
9398
9427
  $eeTag = 1;
9399
9428
  $$et{OPTIONS}{Unknown} = 1;
9400
9429
  }
@@ -9629,7 +9658,7 @@ ItemID: foreach $id (keys %$items) {
9629
9658
  }
9630
9659
  if ($tag eq 'stbl') {
9631
9660
  # process sample data when exiting SampleTable box if extracting embedded
9632
- ProcessSamples($et) if $ee or $md5;
9661
+ ProcessSamples($et) if $ee or $hash;
9633
9662
  } elsif ($tag eq 'minf') {
9634
9663
  $$et{HandlerType} = ''; # reset handler type at end of media info box
9635
9664
  }
@@ -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;
@@ -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
  }
@@ -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
@@ -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
  }
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.60';
37
+ $VERSION = '3.61';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -1061,7 +1061,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1061
1061
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
1062
1062
  },{
1063
1063
  Name => 'Tag2010i', # ?
1064
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-(1F?|E10))\b/',
1064
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX95|HX99|RX0M2)|ZV-(1F?|E10))\b/',
1065
1065
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
1066
1066
  },{
1067
1067
  Name => 'Tag_0x2010',
@@ -1137,7 +1137,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1137
1137
  # FocusMode for SLT/HV/ILCA and NEX/ILCE; doesn't seem to apply to DSC models (always 0)
1138
1138
  # from 2018: at least DSC-RX10M4 and RX100M6 also use this tag
1139
1139
  Name => 'FocusMode',
1140
- Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)/)',
1140
+ Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2)/)',
1141
1141
  Writable => 'int8u',
1142
1142
  Priority => 0,
1143
1143
  PrintConv => {
@@ -1169,7 +1169,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1169
1169
  },
1170
1170
  },{
1171
1171
  Name => 'AFAreaModeSetting',
1172
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV-E|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/',
1172
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2))/',
1173
1173
  Notes => 'NEX, ILCE and some DSC models',
1174
1174
  RawConv => '$$self{AFAreaILCE} = $val',
1175
1175
  DataMember => 'AFAreaILCE',
@@ -1205,7 +1205,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1205
1205
  # observed values in range (0 0) to (640 480), with center (320 240) often seen
1206
1206
  # for NEX-5R/6, positions appear to be in an 11x9 grid
1207
1207
  Name => 'FlexibleSpotPosition',
1208
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV-E|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/',
1208
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2))/',
1209
1209
  Writable => 'int16u',
1210
1210
  Count => 2,
1211
1211
  Notes => q{
@@ -1365,7 +1365,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1365
1365
  # from 2018: at least DSC-RX10M4 and RX100M6 also use this tag
1366
1366
  0x2021 => { #JR
1367
1367
  Name => 'AFTracking',
1368
- Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)/)',
1368
+ Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2)/)',
1369
1369
  Writable => 'int8u',
1370
1370
  PrintConv => {
1371
1371
  0 => 'Off',
@@ -2070,6 +2070,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2070
2070
  390 => 'ILCE-7RM5', #IB
2071
2071
  391 => 'ILME-FX30', #JR
2072
2072
  393 => 'ZV-E1', #JR
2073
+ 395 => 'ZV-1M2', #JR
2073
2074
  },
2074
2075
  },
2075
2076
  0xb020 => { #2
@@ -6182,6 +6183,7 @@ my %pictureProfile2010 = (
6182
6183
  31 => 'Gamma S-Log3 (PP8 or PP9)', #14
6183
6184
  33 => 'Gamma HLG2 (PP10)', #14
6184
6185
  34 => 'Gamma HLG3', #IB
6186
+ 36 => 'Off',
6185
6187
  37 => 'FL',
6186
6188
  38 => 'VV2',
6187
6189
  39 => 'IN',
@@ -6637,8 +6639,30 @@ my %isoSetting2010 = (
6637
6639
  },
6638
6640
  #0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' },
6639
6641
  #0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' },
6642
+ 0x192c => {
6643
+ Name => 'AspectRatio',
6644
+ Condition => '$$self{Model} !~ /^(DSC-RX100|Stellar)\b/',
6645
+ PrintConv => {
6646
+ 0 => '16:9',
6647
+ 1 => '4:3',
6648
+ 2 => '3:2',
6649
+ 3 => '1:1',
6650
+ 5 => 'Panorama',
6651
+ },
6652
+ },
6640
6653
  #0x192e => { Name => 'SonyImageWidth', Format => 'int16u' },
6641
6654
  #0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' },
6655
+ 0x1a88 => {
6656
+ Name => 'AspectRatio',
6657
+ Condition => '$$self{Model} =~ /^(DSC-RX100|Stellar)\b/',
6658
+ PrintConv => {
6659
+ 0 => '16:9',
6660
+ 1 => '4:3',
6661
+ 2 => '3:2',
6662
+ 3 => '1:1',
6663
+ 5 => 'Panorama',
6664
+ },
6665
+ },
6642
6666
  );
6643
6667
 
6644
6668
  %Image::ExifTool::Sony::Tag2010f = ( #JR
@@ -6714,6 +6738,16 @@ my %isoSetting2010 = (
6714
6738
  },
6715
6739
  #0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' },
6716
6740
  #0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' },
6741
+ 0x192c => {
6742
+ Name => 'AspectRatio',
6743
+ PrintConv => {
6744
+ 0 => '16:9',
6745
+ 1 => '4:3',
6746
+ 2 => '3:2',
6747
+ 3 => '1:1',
6748
+ 5 => 'Panorama',
6749
+ },
6750
+ },
6717
6751
  #0x192e => { Name => 'SonyImageWidth', Format => 'int16u' },
6718
6752
  #0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' },
6719
6753
  );
@@ -6845,6 +6879,16 @@ my %isoSetting2010 = (
6845
6879
  },
6846
6880
  # 0x1940 => { Name => 'SonyImageWidth', Format => 'int16u' },
6847
6881
  # 0x1944 => { Name => 'SonyImageHeight', Format => 'int16u' },
6882
+ 0x1958 => {
6883
+ Name => 'AspectRatio',
6884
+ PrintConv => {
6885
+ 0 => '16:9',
6886
+ 1 => '4:3',
6887
+ 2 => '3:2',
6888
+ 3 => '1:1',
6889
+ 5 => 'Panorama',
6890
+ },
6891
+ },
6848
6892
  # 0x195a => { Name => 'SonyImageWidth', Format => 'int16u' },
6849
6893
  # 0x195c => { Name => 'SonyImageHeight', Format => 'int16u' },
6850
6894
  );
@@ -6982,6 +7026,16 @@ my %isoSetting2010 = (
6982
7026
  Condition => '$$self{Model} !~ /^DSC-/',
6983
7027
  PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'},
6984
7028
  },
7029
+ 0x192c => {
7030
+ Name => 'AspectRatio',
7031
+ PrintConv => {
7032
+ 0 => '16:9',
7033
+ 1 => '4:3',
7034
+ 2 => '3:2',
7035
+ 3 => '1:1',
7036
+ 5 => 'Panorama',
7037
+ },
7038
+ },
6985
7039
  # 0x1970 => { Name => 'SonyImageWidth', Format => 'int16u' },
6986
7040
  # 0x1974 => { Name => 'SonyImageHeight', Format => 'int16u' },
6987
7041
  # 0x198a => { Name => 'SonyImageWidth', Format => 'int16u' },
@@ -7113,6 +7167,16 @@ my %isoSetting2010 = (
7113
7167
  Condition => '$$self{Model} !~ /^DSC-/',
7114
7168
  PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'},
7115
7169
  },
7170
+ 0x188c => {
7171
+ Name => 'AspectRatio',
7172
+ PrintConv => {
7173
+ 0 => '16:9',
7174
+ 1 => '4:3',
7175
+ 2 => '3:2',
7176
+ 3 => '1:1',
7177
+ 5 => 'Panorama',
7178
+ },
7179
+ },
7116
7180
  );
7117
7181
 
7118
7182
  %Image::ExifTool::Sony::Tag202a = (
@@ -8273,6 +8337,30 @@ my %isoSetting2010 = (
8273
8337
  Format => 'int8u',
8274
8338
  PrintConv => 'sprintf("20%.2d", $val)',
8275
8339
  },
8340
+ 0x0133 => {
8341
+ Name => 'ShutterType',
8342
+ Condition => '$$self{Model} =~ /^(DSC-(HX350|HX400V|HX60V|HX80|HX90|HX90V|QX30|RX10|RX10M2|RX10M3|RX100M3|RX100M4))\b/',
8343
+ PrintConv => {
8344
+ 7 => 'Electronic',
8345
+ 23 => 'Mechanical',
8346
+ },
8347
+ },
8348
+ 0x0139 => {
8349
+ Name => 'ShutterType',
8350
+ Condition => '$$self{Model} =~ /^(DSC-(HX95|HX99|RX0|RX0M2|RX10M4|RX100M5|RX100M5A|RX100M6))\b/',
8351
+ PrintConv => {
8352
+ 7 => 'Electronic',
8353
+ 23 => 'Mechanical',
8354
+ },
8355
+ },
8356
+ 0x013f => {
8357
+ Name => 'ShutterType',
8358
+ Condition => '$$self{Model} =~ /^(DSC-RX100M7|ZV-(1|1F|1M2))\b/',
8359
+ PrintConv => {
8360
+ 7 => 'Electronic',
8361
+ 23 => 'Mechanical',
8362
+ },
8363
+ },
8276
8364
  );
8277
8365
 
8278
8366
  %Image::ExifTool::Sony::Tag9401 = ( # JR
@@ -8284,7 +8372,7 @@ my %isoSetting2010 = (
8284
8372
  FIRST_ENTRY => 0,
8285
8373
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
8286
8374
  DATAMEMBER => [ 0 ],
8287
- IS_SUBDIR => [ 0x03e2, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8375
+ IS_SUBDIR => [ 0x03e2, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8288
8376
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
8289
8377
 
8290
8378
  0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -8292,7 +8380,8 @@ my %isoSetting2010 = (
8292
8380
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8293
8381
  0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8294
8382
  0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8295
- 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8383
+ 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/ and $$self{Model} !~ /^ZV-1M2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8384
+ 0x04ba => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 155 and $$self{Model} =~ /^ZV-1M2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8296
8385
  0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8297
8386
  0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8298
8387
  0x0636 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(73|74)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -8690,6 +8779,11 @@ my %isoSetting2010 = (
8690
8779
  10 => 'Night View/Portrait',
8691
8780
  11 => 'Autumn Leaves',
8692
8781
  13 => 'Sepia',
8782
+ 15 => 'FL',
8783
+ 16 => 'VV2',
8784
+ 17 => 'IN',
8785
+ 18 => 'SH',
8786
+ 255 => 'Off',
8693
8787
  },
8694
8788
  },
8695
8789
  0x0052 => {