exiftool_vendored 13.06.0 → 13.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +55 -4
  3. data/bin/MANIFEST +1 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +2 -2
  7. data/bin/exiftool +29 -15
  8. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  9. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  10. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  11. data/bin/lib/Image/ExifTool/Apple.pm +9 -7
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +12 -3
  13. data/bin/lib/Image/ExifTool/Canon.pm +19 -1
  14. data/bin/lib/Image/ExifTool/DJI.pm +1 -1
  15. data/bin/lib/Image/ExifTool/Exif.pm +2 -2
  16. data/bin/lib/Image/ExifTool/FITS.pm +2 -2
  17. data/bin/lib/Image/ExifTool/FLIF.pm +2 -2
  18. data/bin/lib/Image/ExifTool/FlashPix.pm +11 -11
  19. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  20. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  21. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  22. data/bin/lib/Image/ExifTool/ICC_Profile.pm +80 -1
  23. data/bin/lib/Image/ExifTool/ID3.pm +3 -3
  24. data/bin/lib/Image/ExifTool/IPTC.pm +2 -2
  25. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  26. data/bin/lib/Image/ExifTool/Jpeg2000.pm +8 -7
  27. data/bin/lib/Image/ExifTool/M2TS.pm +39 -9
  28. data/bin/lib/Image/ExifTool/MXF.pm +2 -2
  29. data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  31. data/bin/lib/Image/ExifTool/PDF.pm +15 -15
  32. data/bin/lib/Image/ExifTool/PLIST.pm +3 -3
  33. data/bin/lib/Image/ExifTool/PNG.pm +6 -5
  34. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  35. data/bin/lib/Image/ExifTool/PhaseOne.pm +3 -3
  36. data/bin/lib/Image/ExifTool/Photoshop.pm +64 -3
  37. data/bin/lib/Image/ExifTool/Protobuf.pm +4 -4
  38. data/bin/lib/Image/ExifTool/QuickTime.pm +72 -24
  39. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +336 -91
  40. data/bin/lib/Image/ExifTool/README +4 -1
  41. data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
  42. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/Ricoh.pm +3 -3
  44. data/bin/lib/Image/ExifTool/Sony.pm +2 -2
  45. data/bin/lib/Image/ExifTool/TagInfoXML.pm +4 -3
  46. data/bin/lib/Image/ExifTool/TagLookup.pm +6982 -6970
  47. data/bin/lib/Image/ExifTool/TagNames.pod +48 -5
  48. data/bin/lib/Image/ExifTool/VCard.pm +2 -2
  49. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  50. data/bin/lib/Image/ExifTool/WriteExif.pl +2 -2
  51. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +47 -13
  52. data/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
  53. data/bin/lib/Image/ExifTool/Writer.pl +32 -21
  54. data/bin/lib/Image/ExifTool/XMP.pm +9 -9
  55. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  56. data/bin/lib/Image/ExifTool.pm +65 -61
  57. data/bin/lib/Image/ExifTool.pod +41 -35
  58. data/bin/perl-Image-ExifTool.spec +1 -1
  59. data/lib/exiftool_vendored/version.rb +1 -1
  60. metadata +2 -2
@@ -12,6 +12,7 @@
12
12
  # 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
13
13
  # 6) Eef Vreeland private communication
14
14
  # 7) https://color.org/specification/ICC.2-2019.pdf
15
+ # 8) https://www.color.org/specification/ICC.1-2022-05.pdf
15
16
  #
16
17
  # Notes: The ICC profile information is different: the format of each
17
18
  # tag is embedded in the information instead of in the directory
@@ -25,7 +26,7 @@ use strict;
25
26
  use vars qw($VERSION);
26
27
  use Image::ExifTool qw(:DataAccess :Utils);
27
28
 
28
- $VERSION = '1.40';
29
+ $VERSION = '1.41';
29
30
 
30
31
  sub ProcessICC($$);
31
32
  sub ProcessICC_Profile($$$);
@@ -367,6 +368,7 @@ my %manuSig = ( #6
367
368
  Groups => { 2 => 'Time' },
368
369
  PrintConv => '$self->ConvertDateTime($val)',
369
370
  },
371
+
370
372
  targ => {
371
373
  Name => 'CharTarget',
372
374
  ValueConv => '$val=~s/\0.*//; length $val > 128 ? \$val : $val',
@@ -493,6 +495,10 @@ my %manuSig = ( #6
493
495
  },
494
496
  },
495
497
  ciis => 'ColorimetricIntentImageState', #5
498
+ cicp => { #8 (Coding-independent Code Points)
499
+ Name => 'ColorRepresentation',
500
+ SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::ColorRep' },
501
+ },
496
502
  scoe => 'SceneColorimetryEstimates', #5
497
503
  sape => 'SceneAppearanceEstimates', #5
498
504
  fpce => 'FocalPlaneColorimetryEstimates', #5
@@ -628,6 +634,7 @@ my %manuSig = ( #6
628
634
  s2cp => 'StandardToCustomPcc',
629
635
  smap => 'SurfaceMap',
630
636
  # smwp ? (seen in some v5 samples [was a mistake in sample production])
637
+ hdgm => { Name => 'HDGainMapInfo', Binary => 1 }, #PH
631
638
 
632
639
  # the following entry represents the ICC profile header, and doesn't
633
640
  # exist as a tag in the directory. It is only in this table to provide
@@ -747,6 +754,78 @@ my %manuSig = ( #6
747
754
  },
748
755
  );
749
756
 
757
+ # Coding-independent code points (cicp) definition
758
+ # (NOTE: conversions are the same as Image::ExifTool::QuickTime::ColorRep tags)
759
+ %Image::ExifTool::ICC_Profile::ColorRep = (
760
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
761
+ GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-cicp', 2 => 'Image' },
762
+ 8 => {
763
+ Name => 'ColorPrimaries',
764
+ PrintConv => {
765
+ 1 => 'BT.709',
766
+ 2 => 'Unspecified',
767
+ 4 => 'BT.470 System M (historical)',
768
+ 5 => 'BT.470 System B, G (historical)',
769
+ 6 => 'BT.601',
770
+ 7 => 'SMPTE 240',
771
+ 8 => 'Generic film (color filters using illuminant C)',
772
+ 9 => 'BT.2020, BT.2100',
773
+ 10 => 'SMPTE 428 (CIE 1931 XYZ)', #forum14766
774
+ 11 => 'SMPTE RP 431-2',
775
+ 12 => 'SMPTE EG 432-1',
776
+ 22 => 'EBU Tech. 3213-E',
777
+ },
778
+ },
779
+ 9 => {
780
+ Name => 'TransferCharacteristics',
781
+ PrintConv => {
782
+ 0 => 'For future use (0)',
783
+ 1 => 'BT.709',
784
+ 2 => 'Unspecified',
785
+ 3 => 'For future use (3)',
786
+ 4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
787
+ 5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
788
+ 6 => 'BT.601',
789
+ 7 => 'SMPTE 240 M',
790
+ 8 => 'Linear',
791
+ 9 => 'Logarithmic (100 : 1 range)',
792
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
793
+ 11 => 'IEC 61966-2-4',
794
+ 12 => 'BT.1361',
795
+ 13 => 'sRGB or sYCC',
796
+ 14 => 'BT.2020 10-bit systems',
797
+ 15 => 'BT.2020 12-bit systems',
798
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
799
+ 17 => 'SMPTE ST 428',
800
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
801
+ },
802
+ },
803
+ 10 => {
804
+ Name => 'MatrixCoefficients',
805
+ PrintConv => {
806
+ 0 => 'Identity matrix',
807
+ 1 => 'BT.709',
808
+ 2 => 'Unspecified',
809
+ 3 => 'For future use (3)',
810
+ 4 => 'US FCC 73.628',
811
+ 5 => 'BT.470 System B, G (historical)',
812
+ 6 => 'BT.601',
813
+ 7 => 'SMPTE 240 M',
814
+ 8 => 'YCgCo',
815
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
816
+ 10 => 'BT.2020 constant luminance',
817
+ 11 => 'SMPTE ST 2085 YDzDx',
818
+ 12 => 'Chromaticity-derived non-constant luminance',
819
+ 13 => 'Chromaticity-derived constant luminance',
820
+ 14 => 'BT.2100 ICtCp',
821
+ },
822
+ },
823
+ 11 => {
824
+ Name => 'VideoFullRangeFlag',
825
+ PrintConv => { 0 => 'Limited', 1 => 'Full' },
826
+ },
827
+ );
828
+
750
829
  # viewingConditionsType (view) definition
751
830
  %Image::ExifTool::ICC_Profile::ViewingConditions = (
752
831
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -1169,7 +1169,7 @@ sub ProcessID3v2($$$)
1169
1169
  }
1170
1170
  $tagInfo = $et->GetTagInfo($otherTable, $id) if $otherTable;
1171
1171
  if ($tagInfo) {
1172
- $et->WarnOnce("Frame '${id}' is not valid for this ID3 version", 1);
1172
+ $et->Warn("Frame '${id}' is not valid for this ID3 version", 1);
1173
1173
  } else {
1174
1174
  next unless $verbose or $et->Options('Unknown');
1175
1175
  $id =~ tr/-A-Za-z0-9_//dc;
@@ -1198,7 +1198,7 @@ sub ProcessID3v2($$$)
1198
1198
  }
1199
1199
  }
1200
1200
  if ($flags{Encrypt}) {
1201
- $et->WarnOnce('Encrypted frames currently not supported');
1201
+ $et->Warn('Encrypted frames currently not supported');
1202
1202
  next;
1203
1203
  }
1204
1204
  # extract the value
@@ -1232,7 +1232,7 @@ sub ProcessID3v2($$$)
1232
1232
  next;
1233
1233
  }
1234
1234
  } else {
1235
- $et->WarnOnce('Install Compress::Zlib to decode compressed frames');
1235
+ $et->Warn('Install Compress::Zlib to decode compressed frames');
1236
1236
  next;
1237
1237
  }
1238
1238
  }
@@ -1025,7 +1025,7 @@ sub TranslateCodedString($$$$)
1025
1025
  $$valPtr = $et->Decode($$valPtr, $$xlatPtr);
1026
1026
  } else {
1027
1027
  # don't yet support reading ISO 2022 shifted character sets
1028
- $et->WarnOnce('Some IPTC characters not converted (ISO 2022 shifting not supported)');
1028
+ $et->Warn('Some IPTC characters not converted (ISO 2022 shifting not supported)');
1029
1029
  }
1030
1030
  }
1031
1031
 
@@ -1164,7 +1164,7 @@ sub ProcessIPTC($$$)
1164
1164
  }
1165
1165
  my $tableInfo = $tagTablePtr->{$rec};
1166
1166
  unless ($tableInfo) {
1167
- $et->WarnOnce("Unrecognized IPTC record $rec (ignored)");
1167
+ $et->Warn("Unrecognized IPTC record $rec (ignored)");
1168
1168
  $pos += $len;
1169
1169
  next; # ignore this entry
1170
1170
  }
@@ -78,7 +78,7 @@ sub ProcessIND($$)
78
78
  $err = 'InDesign files larger than 2 GB not supported (LargeFileSupport not set)';
79
79
  goto DONE;
80
80
  } elsif ($et->Options('LargeFileSupport') eq '2') {
81
- $et->WarnOnce('Processing large file (LargeFileSupport is 2)');
81
+ $et->Warn('Processing large file (LargeFileSupport is 2)');
82
82
  }
83
83
  }
84
84
  if ($outfile) {
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.42';
19
+ $VERSION = '1.43';
20
20
 
21
21
  sub ProcessJpeg2000Box($$$);
22
22
  sub ProcessJUMD($$$);
@@ -631,6 +631,7 @@ my %j2cMarker = (
631
631
  %Image::ExifTool::Jpeg2000::ColorSpec = (
632
632
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
633
633
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData, # (we don't actually call this)
634
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
634
635
  GROUPS => { 2 => 'Image' },
635
636
  FORMAT => 'int8s',
636
637
  WRITABLE => 1,
@@ -866,8 +867,8 @@ sub BrotliWarn($$;$)
866
867
  {
867
868
  my ($et, $type, $uncompress) = @_;
868
869
  my ($enc, $mod) = $uncompress ? qw(decoding Uncompress) : qw(encoding Compress);
869
- $et->WarnOnce("Error $enc '${type}' brob box");
870
- $et->WarnOnce("Try updating to IO::${mod}::Brotli 0.004 or later");
870
+ $et->Warn("Error $enc '${type}' brob box");
871
+ $et->Warn("Try updating to IO::${mod}::Brotli 0.004 or later");
871
872
  }
872
873
 
873
874
  #------------------------------------------------------------------------------
@@ -933,7 +934,7 @@ sub CreateNewBoxes($$)
933
934
  $tag = 'brob';
934
935
  }
935
936
  } else {
936
- $et->WarnOnce('Install IO::Compress::Brotli to create Brotli-compressed metadata');
937
+ $et->Warn('Install IO::Compress::Brotli to create Brotli-compressed metadata');
937
938
  }
938
939
  }
939
940
  my $boxhdr = pack('N', length($newdir) + length($pad) + 8) . $tag;
@@ -1285,7 +1286,7 @@ sub ProcessJpeg2000Box($$$)
1285
1286
  ++$$et{CHANGED};
1286
1287
  }
1287
1288
  } else {
1288
- $et->WarnOnce('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1289
+ $et->Warn('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1289
1290
  }
1290
1291
  } elsif (not $compress and $boxID eq 'brob') {
1291
1292
  # (in this case, ProcessBrotli has returned uncompressed data,
@@ -1410,7 +1411,7 @@ sub ProcessBrotli($$$)
1410
1411
  }
1411
1412
  if (eval { require IO::Uncompress::Brotli }) {
1412
1413
  if ($isWriting and not eval { require IO::Compress::Brotli }) {
1413
- $et->WarnOnce('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1414
+ $et->Warn('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1414
1415
  return undef;
1415
1416
  }
1416
1417
  my $compress = $et->Options('Compress');
@@ -1455,7 +1456,7 @@ sub ProcessBrotli($$$)
1455
1456
  return $type . $dat;
1456
1457
  }
1457
1458
  } else {
1458
- $et->WarnOnce('Install IO::Uncompress::Brotli to decode Brotli-compressed metadata');
1459
+ $et->Warn('Install IO::Uncompress::Brotli to decode Brotli-compressed metadata');
1459
1460
  return undef if $isWriting;
1460
1461
  }
1461
1462
  return 1;
@@ -32,7 +32,7 @@ use strict;
32
32
  use vars qw($VERSION);
33
33
  use Image::ExifTool qw(:DataAccess :Utils);
34
34
 
35
- $VERSION = '1.26';
35
+ $VERSION = '1.28';
36
36
 
37
37
  # program map table "stream_type" lookup (ref 6/1/9)
38
38
  my %streamType = (
@@ -305,6 +305,15 @@ sub ParsePID($$$$$)
305
305
  # MPEG-1/MPEG-2 Audio
306
306
  require Image::ExifTool::MPEG;
307
307
  Image::ExifTool::MPEG::ParseMPEGAudio($et, $dataPt);
308
+ } elsif ($type == 6 and $pid == 0x0300) {
309
+ # LIGOGPSINFO from unknown dashcam (../testpics/gps_video/Wrong Way pass.ts)
310
+ if ($$dataPt =~ /^LIGOGPSINFO/s) {
311
+ my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
312
+ my %dirInfo = ( DataPt => $dataPt, DirName => 'Ligo0x0300' );
313
+ Image::ExifTool::QuickTime::ProcessLigoGPS($et, \%dirInfo, $tbl, 1);
314
+ $$et{FoundGoodGPS} = 1;
315
+ $more = 1;
316
+ }
308
317
  } elsif ($type == 0x1b) {
309
318
  # H.264 Video
310
319
  require Image::ExifTool::H264;
@@ -313,7 +322,7 @@ sub ParsePID($$$$$)
313
322
  if ($$et{OPTIONS}{ExtractEmbedded}) {
314
323
  $more = 1;
315
324
  } elsif (not $$et{OPTIONS}{Validate}) {
316
- $et->WarnOnce('The ExtractEmbedded option may find more tags in the video data',3);
325
+ $et->Warn('The ExtractEmbedded option may find more tags in the video data',3);
317
326
  }
318
327
  } elsif ($type == 0x81 or $type == 0x87 or $type == 0x91) {
319
328
  # AC-3 audio
@@ -459,11 +468,11 @@ sub ParsePID($$$$$)
459
468
  $bad = 1 if $_ < 0x30 or $_ > 0x39;
460
469
  }
461
470
  if ($bad) {
462
- $et->WarnOnce('Error decrypting GPS degrees');
471
+ $et->Warn('Error decrypting GPS degrees');
463
472
  } else {
464
473
  my $la = pack('C*', @chars[0,1]);
465
474
  my $lo = pack('C*', @chars[2,3,4]);
466
- $et->WarnOnce('Decryption of this GPS is highly experimental. More testing samples are required');
475
+ $et->Warn('Decryption of this GPS is highly experimental. More testing samples are required');
467
476
  $et->HandleTag($tagTbl, GPSLatitude => (($la || 0) + (($6-85.95194)/2.43051724137931+42.2568)/60) * ($7 eq 'N' ? 1 : -1));
468
477
  $et->HandleTag($tagTbl, GPSLongitude => (($lo || 0) + (($9-70.14674)/1.460987654320988+9.2028)/60) * ($10 eq 'E' ? 1 : -1));
469
478
  }
@@ -476,7 +485,7 @@ sub ParsePID($$$$$)
476
485
  my $lon = abs(GetFloat($dataPt, 56)); # (abs just to be safe)
477
486
  my $spd = GetFloat($dataPt, 64);
478
487
  my $trk = GetFloat($dataPt, 68);
479
- $et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong');
488
+ $et->Warn('GPSLatitude/Longitude encryption is not yet known, so these will be wrong');
480
489
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
481
490
  my @date = unpack('x32V3x28V3', $$dataPt);
482
491
  $date[3] += 2000;
@@ -514,9 +523,16 @@ sub ParsePID($$$$$)
514
523
  $et->HandleTag($tagTbl, GPSTrack => $a[2] / 100);
515
524
  }
516
525
  # Note: 10 bytes after last GPS record look like a single 3-axis accelerometer reading:
517
- # eg. fd ff 00 00 ff ff 00 00 01 00
526
+ # eg. fd ff 00 00 ff ff 00 00 01 00
518
527
  $$et{FoundGoodGPS} = 1; # so we skip over unrecognized packets
519
528
  $more = 1;
529
+ } elsif ($$dataPt =~ /^skip.{4}LIGOGPSINFO\0/s) {
530
+ # (this record contains 2 copies of the same 'skip' atom in my sample --
531
+ # only extract data from the first one)
532
+ my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
533
+ my %dirInfo = ( DataPt => $dataPt, DirStart => 8, DirName => sprintf('Ligo0x%.4x',$pid));
534
+ Image::ExifTool::QuickTime::ProcessLigoGPS($et, \%dirInfo, $tbl, 1);
535
+ $$et{FoundGoodGPS} = 1;
520
536
  } elsif ($$et{FoundGoodGPS}) {
521
537
  $more = 1;
522
538
  }
@@ -694,7 +710,7 @@ sub ProcessM2TS($$)
694
710
  # or if we are just looking for the last timestamp
695
711
  next unless $payload_data_exists and not defined $backScan;
696
712
 
697
- # decode payload data
713
+ # decode payload data
698
714
  if ($pid == 0 or # program association table
699
715
  defined $pmt{$pid}) # program map table(s)
700
716
  {
@@ -787,7 +803,7 @@ sub ProcessM2TS($$)
787
803
  last if $j + $descriptor_length > $program_info_length;
788
804
  my $desc = substr($buf2, $pos+$j, $descriptor_length);
789
805
  $j += $descriptor_length;
790
- $desc =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg;
806
+ $desc =~ s/([\x00-\x1f\x7f-\xff])/sprintf("\\x%.2x",ord $1)/eg;
791
807
  printf $out " Program Descriptor: Type=0x%.2x \"$desc\"\n", $descriptor_tag;
792
808
  }}
793
809
  $pos += $program_info_length; # skip descriptors (for now)
@@ -822,7 +838,7 @@ sub ProcessM2TS($$)
822
838
  $j += $descriptor_length;
823
839
  if ($verbose > 1) {
824
840
  my $dstr = $desc;
825
- $dstr =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg;
841
+ $dstr =~ s/([\x00-\x1f\x7f-\xff])/sprintf("\\x%.2x",ord $1)/eg;
826
842
  printf $out " ES Descriptor: Type=0x%.2x \"$dstr\"\n", $descriptor_tag;
827
843
  }
828
844
  # parse type-specific descriptor information (once)
@@ -954,6 +970,20 @@ sub ProcessM2TS($$)
954
970
  ParsePID($et, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
955
971
  delete $data{$pid};
956
972
  }
973
+
974
+ # look for LIGOGPSINFO trailer
975
+ if ($et->Options('ExtractEmbedded') and
976
+ $raf->Seek(-8, 2) and $raf->Read($buff, 8) == 8 and
977
+ $buff =~ /^&&&&/)
978
+ {
979
+ my $len = unpack('x4N', $buff);
980
+ if ($len < $raf->Tell() and $raf->Seek(-$len, 2) and $raf->Read($buff,$len) == $len) {
981
+ my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
982
+ my %dirInfo = ( DataPt => \$buff, DirStart => 8, DirName => 'LigoTrailer' );
983
+ Image::ExifTool::QuickTime::ProcessLigoGPS($et, \%dirInfo, $tbl);
984
+ }
985
+ }
986
+
957
987
  return 1;
958
988
  }
959
989
 
@@ -2525,7 +2525,7 @@ sub ReadMXFValue($$$)
2525
2525
  } elsif ($type =~ /(Array|Batch)/ and $len > 16) {
2526
2526
  my ($count, $size) = unpack('NN', $val);
2527
2527
  # validate data length
2528
- $len == 8 + $count * $size or $et->WarnOnce("Bad array or batch size");
2528
+ $len == 8 + $count * $size or $et->Warn("Bad array or batch size");
2529
2529
  my ($i, @a);
2530
2530
  for ($i=0; $i<$count; ++$i) {
2531
2531
  my $pos = 8 + $i * $size;
@@ -2626,7 +2626,7 @@ sub ProcessLocalSet($$$)
2626
2626
  $extra = sprintf(', Local 0x%.4x', $loc);
2627
2627
  } else {
2628
2628
  $tag = $loc;
2629
- # $et->WarnOnce('Missing local key for at least one tag');
2629
+ # $et->Warn('Missing local key for at least one tag');
2630
2630
  $extra = ', NOT IN PRIMER!';
2631
2631
  }
2632
2632
  my $tagInfo = $$tagTablePtr{$tag};
@@ -1097,7 +1097,7 @@ sub ProcessMKV($$)
1097
1097
  if ($more >= 0x80000000) {
1098
1098
  last unless $et->Options('LargeFileSupport');
1099
1099
  if ($et->Options('LargeFileSupport') eq '2') {
1100
- $et->WarnOnce('Processing large block (LargeFileSupport is 2)');
1100
+ $et->Warn('Processing large block (LargeFileSupport is 2)');
1101
1101
  }
1102
1102
  }
1103
1103
  $raf->Seek($more, 1) or last;
@@ -907,7 +907,7 @@ sub WriteXtraValue($$$)
907
907
  $type = 72;
908
908
  }
909
909
  } else {
910
- $et->WarnOnce("Error converting value for Microsoft:$$tagInfo{Name}");
910
+ $et->Warn("Error converting value for Microsoft:$$tagInfo{Name}");
911
911
  }
912
912
  SetByteOrder('MM');
913
913
  if (defined $type) {
@@ -1215,7 +1215,7 @@ sub DecodeStream($$)
1215
1215
  # be sure we can process all the filters before we take the time to do the decryption
1216
1216
  foreach $filter (@filters) {
1217
1217
  next if $supportedFilter{$filter};
1218
- $et->WarnOnce("Unsupported Filter $filter");
1218
+ $et->Warn("Unsupported Filter $filter");
1219
1219
  return 0;
1220
1220
  }
1221
1221
  # apply decryption first if required (and if the default encryption
@@ -1244,7 +1244,7 @@ sub DecodeStream($$)
1244
1244
  if (ref $decodeParms eq 'HASH') {
1245
1245
  $pre = $$decodeParms{Predictor};
1246
1246
  if ($pre and $pre ne '1' and $pre ne '12') {
1247
- $et->WarnOnce("FlateDecode Predictor $pre currently not supported");
1247
+ $et->Warn("FlateDecode Predictor $pre currently not supported");
1248
1248
  return 0;
1249
1249
  }
1250
1250
  }
@@ -1259,7 +1259,7 @@ sub DecodeStream($$)
1259
1259
  return 0;
1260
1260
  }
1261
1261
  } else {
1262
- $et->WarnOnce('Install Compress::Zlib to process filtered streams');
1262
+ $et->Warn('Install Compress::Zlib to process filtered streams');
1263
1263
  return 0;
1264
1264
  }
1265
1265
  next unless $pre and $pre eq '12'; # 12 = 'up' prediction
@@ -1268,7 +1268,7 @@ sub DecodeStream($$)
1268
1268
  my $cols = $$decodeParms{Columns};
1269
1269
  unless ($cols) {
1270
1270
  # currently only support 'up' prediction
1271
- $et->WarnOnce('No Columns for decoding stream');
1271
+ $et->Warn('No Columns for decoding stream');
1272
1272
  return 0;
1273
1273
  }
1274
1274
  my @bytes = unpack('C*', $$dict{_stream});
@@ -1276,7 +1276,7 @@ sub DecodeStream($$)
1276
1276
  my $buff = '';
1277
1277
  while (@bytes > $cols) {
1278
1278
  unless (($_ = shift @bytes) == 2) {
1279
- $et->WarnOnce("Unsupported PNG filter $_"); # (yes, PNG)
1279
+ $et->Warn("Unsupported PNG filter $_"); # (yes, PNG)
1280
1280
  return 0;
1281
1281
  }
1282
1282
  foreach (@pre) {
@@ -1296,11 +1296,11 @@ sub DecodeStream($$)
1296
1296
  my $name = $$decodeParms{Name};
1297
1297
  next unless defined $name or $name eq 'Identity';
1298
1298
  if ($name ne 'StdCF') {
1299
- $et->WarnOnce("Unsupported Crypt Filter $name");
1299
+ $et->Warn("Unsupported Crypt Filter $name");
1300
1300
  return 0;
1301
1301
  }
1302
1302
  unless ($cryptInfo) {
1303
- $et->WarnOnce('Missing Encrypt StdCF entry');
1303
+ $et->Warn('Missing Encrypt StdCF entry');
1304
1304
  return 0;
1305
1305
  }
1306
1306
  # decrypt the stream manually because we want to:
@@ -1318,15 +1318,15 @@ sub DecodeStream($$)
1318
1318
  # make sure we don't have any unsupported decoding parameters
1319
1319
  if (ref $decodeParms eq 'HASH') {
1320
1320
  if ($$decodeParms{Predictor}) {
1321
- $et->WarnOnce("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
1321
+ $et->Warn("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
1322
1322
  return 0;
1323
1323
  } elsif ($$decodeParms{EarlyChange}) {
1324
- $et->WarnOnce("LZWDecode EarlyChange currently not supported");
1324
+ $et->Warn("LZWDecode EarlyChange currently not supported");
1325
1325
  return 0;
1326
1326
  }
1327
1327
  }
1328
1328
  unless (DecodeLZW(\$$dict{_stream})) {
1329
- $et->WarnOnce('LZW decompress error');
1329
+ $et->Warn('LZW decompress error');
1330
1330
  return 0;
1331
1331
  }
1332
1332
 
@@ -1362,7 +1362,7 @@ sub DecodeStream($$)
1362
1362
  last if $_ eq '~';
1363
1363
  # (both $n and $val are zero again now)
1364
1364
  }
1365
- $err and $et->WarnOnce("ASCII85Decode error $err");
1365
+ $err and $et->Warn("ASCII85Decode error $err");
1366
1366
  $$dict{_stream} = pack('C*', @out);
1367
1367
  }
1368
1368
  }
@@ -1830,7 +1830,7 @@ sub ProcessDict($$$$;$$)
1830
1830
 
1831
1831
  $nesting = ($nesting || 0) + 1;
1832
1832
  if ($nesting > 50) {
1833
- $et->WarnOnce('Nesting too deep (directory ignored)');
1833
+ $et->Warn('Nesting too deep (directory ignored)');
1834
1834
  return;
1835
1835
  }
1836
1836
  # save entire dictionary for rewriting if specified
@@ -1990,7 +1990,7 @@ sub ProcessDict($$$$;$$)
1990
1990
  if ($$tagInfo{IgnoreDuplicates}) {
1991
1991
  my $flag = "ProcessedPDF_$tag";
1992
1992
  if ($$et{$flag}) {
1993
- next if $et->WarnOnce("Ignored duplicate $tag dictionary", 2);
1993
+ next if $et->Warn("Ignored duplicate $tag dictionary", 2);
1994
1994
  } else {
1995
1995
  $$et{$flag} = 1;
1996
1996
  }
@@ -2171,9 +2171,9 @@ sub ProcessDict($$$$;$$)
2171
2171
  my $type = $$dict{Type} || '';
2172
2172
  if ($type ne '/Metadata' or $$dict{Length} > 100000) {
2173
2173
  if ($$et{OPTIONS}{IgnoreMinorErrors}) {
2174
- $et->WarnOnce("Decrypting large $$tagInfo{Name} (will be slow)");
2174
+ $et->Warn("Decrypting large $$tagInfo{Name} (will be slow)");
2175
2175
  } else {
2176
- $et->WarnOnce("Skipping large AES-encrypted $$tagInfo{Name}", 2);
2176
+ $et->Warn("Skipping large AES-encrypted $$tagInfo{Name}", 2);
2177
2177
  last;
2178
2178
  }
2179
2179
  }
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::XMP;
22
22
  use Image::ExifTool::GPS;
23
23
 
24
- $VERSION = '1.12';
24
+ $VERSION = '1.13';
25
25
 
26
26
  sub ExtractObject($$;$);
27
27
  sub Get24u($$);
@@ -269,7 +269,7 @@ sub ExtractObject($$;$)
269
269
  if ($type == 13) { # dict
270
270
  # prevent infinite recursion
271
271
  if (defined $parent and length $parent > 1000) {
272
- $et->WarnOnce('Possible deep recursion while parsing PLIST');
272
+ $et->Warn('Possible deep recursion while parsing PLIST');
273
273
  return undef;
274
274
  }
275
275
  my $tagTablePtr = $$plistInfo{TagTablePtr};
@@ -344,7 +344,7 @@ sub ProcessBinaryPLIST($$;$)
344
344
  my ($i, $buff, @table);
345
345
  my $dataPt = $$dirInfo{DataPt};
346
346
 
347
- $et->VerboseDir('Binary PLIST');
347
+ $et->VerboseDir('Binary PLIST') unless $$dirInfo{NoVerboseDir};
348
348
  SetByteOrder('MM');
349
349
 
350
350
  if ($dataPt) {
@@ -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.69';
39
+ $VERSION = '1.70';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -435,6 +435,7 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
435
435
  %Image::ExifTool::PNG::PhysicalPixel = (
436
436
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
437
437
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
438
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
438
439
  WRITABLE => 1,
439
440
  GROUPS => { 1 => 'PNG-pHYs', 2 => 'Image' },
440
441
  WRITE_GROUP => 'PNG-pHYs',
@@ -965,7 +966,7 @@ sub FoundPNG($$$$;$$$$)
965
966
  my $processed;
966
967
  if ($$tagInfo{SubDirectory}) {
967
968
  if ($$et{OPTIONS}{Validate} and $$tagInfo{NonStandard}) {
968
- $et->WarnOnce("Non-standard $$tagInfo{NonStandard} in PNG $tag chunk", 1);
969
+ $et->Warn("Non-standard $$tagInfo{NonStandard} in PNG $tag chunk", 1);
969
970
  }
970
971
  my $subdir = $$tagInfo{SubDirectory};
971
972
  my $dirName = $$subdir{DirName} || $tagName;
@@ -1471,7 +1472,7 @@ sub ProcessPNG($$)
1471
1472
 
1472
1473
  if ($wasEnd) {
1473
1474
  last unless $n; # stop now if normal end of PNG
1474
- $et->WarnOnce("Trailer data after $fileType $endChunk chunk", 1);
1475
+ $et->Warn("Trailer data after $fileType $endChunk chunk", 1);
1475
1476
  $wasTrailer = 1;
1476
1477
  last if $n < 8;
1477
1478
  $$et{SET_GROUP1} = 'Trailer';
@@ -1500,7 +1501,7 @@ sub ProcessPNG($$)
1500
1501
  } elsif ($hdrChunk eq 'IHDR' and $chunk eq 'CgBI') {
1501
1502
  $et->Warn('Non-standard PNG image (Apple iPhone format)');
1502
1503
  } else {
1503
- $et->WarnOnce("$fileType image did not start with $hdrChunk");
1504
+ $et->Warn("$fileType image did not start with $hdrChunk");
1504
1505
  }
1505
1506
  }
1506
1507
  if ($outfile and ($isDatChunk{$chunk} or $chunk eq $endChunk) and @txtOffset) {
@@ -1594,7 +1595,7 @@ sub ProcessPNG($$)
1594
1595
  } else {
1595
1596
  $msg = 'fixed';
1596
1597
  }
1597
- $et->WarnOnce("Text/EXIF chunk(s) found after $$et{FileType} $wasDat ($msg)", 1);
1598
+ $et->Warn("Text/EXIF chunk(s) found after $$et{FileType} $wasDat ($msg)", 1);
1598
1599
  }
1599
1600
  # read chunk data and CRC
1600
1601
  unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) {
@@ -2802,7 +2802,7 @@ sub ProcessLeicaTrailer($;$)
2802
2802
  }
2803
2803
  } else { # M (Type 240)
2804
2804
  # scan for the lens type (M writes 114 bytes of garbage first)
2805
- if ($buff =~ /\G.{114}([\x20-\x7f]*\0*)/sg and length($1) >= 50) {
2805
+ if ($buff =~ /\G.{114}([\x20-\x7e]*\0*)/sg and length($1) >= 50) {
2806
2806
  $expect = 114;
2807
2807
  }
2808
2808
  }
@@ -450,7 +450,7 @@ sub WritePhaseOne($$$)
450
450
 
451
451
  return undef if $dirLen < 12;
452
452
  unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) {
453
- $et->WarnOnce("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
453
+ $et->Warn("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
454
454
  return undef;
455
455
  }
456
456
  my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE};
@@ -591,7 +591,7 @@ sub ProcessPhaseOne($$$)
591
591
 
592
592
  return 0 if $dirLen < 12;
593
593
  unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) {
594
- $et->WarnOnce("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
594
+ $et->Warn("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
595
595
  return undef;
596
596
  }
597
597
  my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE};
@@ -632,7 +632,7 @@ sub ProcessPhaseOne($$$)
632
632
  $formatSize = Get32u($dataPt, $entry+4);
633
633
  $formatStr = $formatName[$formatSize];
634
634
  unless ($formatStr) {
635
- $et->WarnOnce("Unrecognized $ifdType format size $formatSize",1);
635
+ $et->Warn("Unrecognized $ifdType format size $formatSize",1);
636
636
  $formatSize = 1;
637
637
  $formatStr = 'undef';
638
638
  }