exiftool_vendored 13.06.0 → 13.10.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 (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
  }