exiftool_vendored 12.95.0 → 12.96.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32e8098c5012682e4371e1eddf6e7e27f93d06967e776de0451b095e12fb34b1
4
- data.tar.gz: e11e51bed28f32b6bdf52f68c96851bf9be0e98055b0e85418c486a00bef1cd2
3
+ metadata.gz: 470de93eb9d8ccb910e0eb1526fb6b9e1e45cbbeb4a88f63c11ddb4bf33d12b8
4
+ data.tar.gz: 90cf2dd30483d655432ef216f8af1751878fc02b140167eb2f301d856c96109d
5
5
  SHA512:
6
- metadata.gz: 409117e3d0b35ffb614af116f9fc7a9440ff2b15a5a46cc635dea749c4a232c22674ccfa0ae11d5bcbd7b2fab734507b8cd379b1b5fd7d3ac31ebc967564831f
7
- data.tar.gz: bf6761f92ccccd7ad44b2d73875d4ab5d25693b7f3e9c11ec9b63414656906e7e2924eb5b8430144b53dd538e07f9e07916ac1dfd31f4b91b7b54e92f6124d87
6
+ metadata.gz: c22dbe664b9eb4ff2327da76ffeea627b45cc47815e3699202d162503c3129c3a31d5b6f2c380dffdedff2a4dccd6a2bd86b68a8ed2e9003b43168788f1df7f8
7
+ data.tar.gz: 1c86569ae1b1a15088e5ff7a9b13b339ecec57b7df35f97d531e29908fe26d10967ccd71b0a4feba0d6a5e37849cbbfea7526000072fe34692141ce694169717
data/bin/Changes CHANGED
@@ -7,6 +7,12 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.76. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Sept. 1, 2024 - Version 12.96
11
+
12
+ - More improvements to handling of trailers on video files (and add ability to
13
+ write videos which have an unknown trailer)
14
+ - Fixed problem geotagging from some newer Google Takeout files
15
+
10
16
  Aug. 30, 2024 - Version 12.95
11
17
 
12
18
  - Added a couple of new CanonModelID values
data/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.95"
53
+ "version" : "12.96"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '12.95'
34
+ version: '12.96'
data/bin/README CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-12.95.tar.gz | tar -xf -
113
- cd Image-ExifTool-12.95
112
+ gzip -dc Image-ExifTool-12.96.tar.gz | tar -xf -
113
+ cd Image-ExifTool-12.96
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.95';
14
+ my $version = '12.96';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -5655,7 +5655,7 @@ with this command:
5655
5655
 
5656
5656
  produces output like this:
5657
5657
 
5658
- -- Generated by ExifTool 12.95 --
5658
+ -- Generated by ExifTool 12.96 --
5659
5659
  File: a.jpg - 2003:10:31 15:44:19
5660
5660
  (f/5.6, 1/60s, ISO 100)
5661
5661
  File: b.jpg - 2006:05:23 11:57:38
@@ -31,7 +31,7 @@ use vars qw($VERSION);
31
31
  use Image::ExifTool qw(:Public);
32
32
  use Image::ExifTool::GPS;
33
33
 
34
- $VERSION = '1.77';
34
+ $VERSION = '1.78';
35
35
 
36
36
  sub JITTER() { return 2 } # maximum time jitter
37
37
 
@@ -323,7 +323,7 @@ sub LoadTrackLog($$;$)
323
323
  # Google Takeout JSON format
324
324
  $format = 'JSON';
325
325
  $sortFixes = 1; # (fixes are not all in order for this format)
326
- } elsif (/"durationMinutesOffsetFromStartTime"\s*:/) {
326
+ } elsif (/"(durationMinutesOffsetFromStartTime|startTime)"\s*:/) {
327
327
  $format = 'JSON'; # new Google Takeout JSON format (fixes seem to be in order)
328
328
  $raf->Seek(0,0); # rewind to start of file
329
329
  } else {
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
50
50
 
51
- $VERSION = '3.01';
51
+ $VERSION = '3.02';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -9528,7 +9528,7 @@ sub ProcessMOV($$;$)
9528
9528
  my $dirID = $$dirInfo{DirID} || '';
9529
9529
  my $charsetQuickTime = $et->Options('CharsetQuickTime');
9530
9530
  my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
9531
- my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr);
9531
+ my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr, $trailer);
9532
9532
 
9533
9533
  my $topLevel = not $$et{InQuickTime};
9534
9534
  $$et{InQuickTime} = 1;
@@ -9557,6 +9557,17 @@ sub ProcessMOV($$;$)
9557
9557
  $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main');
9558
9558
  }
9559
9559
  ($size, $tag) = unpack('Na4', $buff);
9560
+ my $fast = $$et{OPTIONS}{FastScan} || 0;
9561
+ # check for Insta360 trailer
9562
+ if ($topLevel and not $fast) {
9563
+ my $pos = $raf->Tell();
9564
+ if ($raf->Seek(-40, 2) and $raf->Read($buff, 40) == 40 and
9565
+ substr($buff, 8) eq '8db42d694ccc418790edff439fe026bf')
9566
+ {
9567
+ $trailer = [ 'Insta360', $raf->Tell() - unpack('V',$buff) ];
9568
+ }
9569
+ $raf->Seek($pos,0) or return 0;
9570
+ }
9560
9571
  if ($dataPt) {
9561
9572
  $verbose and $et->VerboseDir($$dirInfo{DirName});
9562
9573
  } else {
@@ -9595,7 +9606,6 @@ sub ProcessMOV($$;$)
9595
9606
  # have XMP take priority except for HEIC
9596
9607
  $$et{PRIORITY_DIR} = 'XMP' unless $fileType and $fileType eq 'HEIC';
9597
9608
  }
9598
- my $fast = $$et{OPTIONS}{FastScan} || 0;
9599
9609
  $$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
9600
9610
 
9601
9611
  my $ee = $$et{OPTIONS}{ExtractEmbedded};
@@ -10136,6 +10146,10 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
10136
10146
  $dataPos += $size + 8; # point to start of next atom data
10137
10147
  last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
10138
10148
  $lastPos = $raf->Tell() + $dirBase;
10149
+ if ($trailer and $lastPos >= $$trailer[1]) {
10150
+ $et->Warn(sprintf('%s trailer at offset 0x%x', @$trailer), 1);
10151
+ last;
10152
+ }
10139
10153
  $raf->Read($buff, 8) == 8 or last;
10140
10154
  $lastTag = $tag if $$tagTablePtr{$tag} and $tag ne 'free'; # (Insta360 sometimes puts free block before trailer)
10141
10155
  ($size, $tag) = unpack('Na4', $buff);
@@ -10143,19 +10157,11 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
10143
10157
  }
10144
10158
  if ($warnStr) {
10145
10159
  # assume this is an unknown trailer if it comes immediately after
10146
- # mdat or moov or free and has a tag name we don't recognize
10147
- # (Insta360 can write trailer after a 'free' atom)
10148
- if (($lastTag eq 'mdat' or $lastTag eq 'moov' or $lastTag eq 'free') and
10160
+ # mdat or moov and has a tag name we don't recognize
10161
+ if (($lastTag eq 'mdat' or $lastTag eq 'moov') and
10149
10162
  (not $$tagTablePtr{$tag} or ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
10150
10163
  {
10151
- if ($raf->Seek(-40, 2) and $raf->Read($buff, 40) == 40 and
10152
- substr($buff, 8) eq '8db42d694ccc418790edff439fe026bf' and
10153
- $lastPos == $raf->Tell() - unpack('V',$buff))
10154
- {
10155
- $et->Warn(sprintf('Insta360 trailer at offset 0x%x', $lastPos), 1);
10156
- } else {
10157
- $et->Warn('Unknown trailer with '.lcfirst($warnStr));
10158
- }
10164
+ $et->Warn('Unknown trailer with '.lcfirst($warnStr));
10159
10165
  } else {
10160
10166
  $et->Warn($warnStr);
10161
10167
  }
@@ -847,7 +847,7 @@ sub WriteQuickTime($$$)
847
847
  $et or return 1; # allow dummy access to autoload this package
848
848
  my ($mdat, @mdat, @mdatEdit, $edit, $track, $outBuff, $co, $term, $delCount);
849
849
  my (%langTags, $canCreate, $delGrp, %boxPos, %didDir, $writeLast, $err, $atomCount);
850
- my ($tag, $lastTag, $lastPos, $errStr, $copyTrailer, $buf2);
850
+ my ($tag, $lastTag, $lastPos, $errStr, $trailer, $buf2);
851
851
  my $outfile = $$dirInfo{OutFile} || return 0;
852
852
  my $raf = $$dirInfo{RAF}; # (will be null for lower-level atoms)
853
853
  my $dataPt = $$dirInfo{DataPt}; # (will be null for top-level atoms)
@@ -860,6 +860,16 @@ sub WriteQuickTime($$$)
860
860
  my $createKeys = 0;
861
861
  my ($rtnVal, $rtnErr) = $dataPt ? (undef, undef) : (1, 0);
862
862
 
863
+ # check for Insta360 trailer at top level
864
+ if ($raf) {
865
+ my $pos = $raf->Tell();
866
+ if ($raf->Seek(-40, 2) and $raf->Read($buf2, 40) == 40 and
867
+ substr($buf2, 8) eq '8db42d694ccc418790edff439fe026bf')
868
+ {
869
+ $trailer = [ 'Insta360', $raf->Tell() - unpack('V',$buf2) ];
870
+ }
871
+ $raf->Seek($pos, 0) or return 0;
872
+ }
863
873
  if ($dataPt) {
864
874
  $raf = File::RandomAccess->new($dataPt);
865
875
  } else {
@@ -924,6 +934,11 @@ sub WriteQuickTime($$$)
924
934
 
925
935
  for (;;) { # loop through all atoms at this level
926
936
  $lastPos = $raf->Tell();
937
+ # stop processing if we reached a known trailer
938
+ if ($trailer and $lastPos >= $$trailer[1]) {
939
+ $errStr = "Corrupted $$trailer[0] trailer" if $lastPos != $$trailer[1];
940
+ last;
941
+ }
927
942
  $lastTag = $tag if $$tagTablePtr{$tag}; # keep track of last known tag
928
943
  if (defined $atomCount and --$atomCount < 0 and $dataPt) {
929
944
  # stop processing now and just copy the rest of the atom
@@ -1524,38 +1539,18 @@ sub WriteQuickTime($$$)
1524
1539
  }
1525
1540
  # ($errStr is set if there was an error that could possibly be due to an unknown trailer)
1526
1541
  if ($errStr) {
1527
- if (($lastTag eq 'mdat' or $lastTag eq 'moov' or ($lastTag eq 'free' and @mdat)) and not $dataPt and
1528
- (not $$tagTablePtr{$tag} or ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
1542
+ if (($lastTag eq 'mdat' or $lastTag eq 'moov') and not $dataPt and (not $$tagTablePtr{$tag} or
1543
+ ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
1529
1544
  {
1530
- # identify known trailers
1531
- if ($raf->Seek(-40,2) and $raf->Read($buf2,40)==40 and
1532
- substr($buf2, 8) eq '8db42d694ccc418790edff439fe026bf' and
1533
- $lastPos == $raf->Tell() - unpack('V',$buf2))
1534
- {
1535
- $copyTrailer = [ $lastPos, 'Insta360' ];
1545
+ # identify other known trailers
1546
+ $buf2 = '';
1547
+ $raf->Seek($lastPos,0) and $raf->Read($buf2,8);
1548
+ if ($buf2 eq 'CCCCCCCC') {
1549
+ $trailer = [ 'Kenwood', $lastPos ];
1550
+ } elsif ($buf2 =~ /^(gpsa|gps0|gsen|gsea)...\0/s) {
1551
+ $trailer = [ 'RIFF', $lastPos ];
1536
1552
  } else {
1537
- $buf2 = '';
1538
- $raf->Seek($lastPos,0) and $raf->Read($buf2,8);
1539
- if ($buf2 eq 'CCCCCCCC') {
1540
- $copyTrailer = [ $lastPos, 'Kenwood' ];
1541
- } elsif ($buf2 =~ /^(gpsa|gps0|gsen|gsea)...\0/s) {
1542
- $copyTrailer = [ $lastPos, 'RIFF' ];
1543
- }
1544
- }
1545
- # are we deleting the trailer?
1546
- my $nvTrail = $et->GetNewValueHash($Image::ExifTool::Extra{Trailer});
1547
- if ($$et{DEL_GROUP}{Trailer} or ($nvTrail and not ($$nvTrail{Value} and $$nvTrail{Value}[0]))) {
1548
- $errStr =~ s/ is too large.*//;
1549
- if ($copyTrailer) {
1550
- $et->Warn("Deleted $$copyTrailer[1] trailer", 1);
1551
- undef $copyTrailer;
1552
- } else {
1553
- $et->Warn('Deleted unknown trailer with ' . lcfirst($errStr), 1);
1554
- }
1555
- } elsif (not $copyTrailer) {
1556
- $et->Warn('Unknown trailer with ' . lcfirst($errStr));
1557
- $et->Error('Use "-trailer=" to delete unknown trailer');
1558
- # (we don't currently copy an unknown trailer due to the chance it could be corrupted data)
1553
+ $trailer = [ 'Unknown', $lastPos ];
1559
1554
  }
1560
1555
  } else {
1561
1556
  $et->Error($errStr);
@@ -2011,16 +2006,20 @@ sub WriteQuickTime($$$)
2011
2006
  Write($outfile, $writeLast) or $rtnVal = 0 if $writeLast;
2012
2007
 
2013
2008
  # copy trailer if necessary
2014
- if ($copyTrailer) {
2015
- if ($raf->Seek($$copyTrailer[0])) {
2016
- $et->Warn(sprintf('Copying %s trailer from offset 0x%x', $$copyTrailer[1], $lastPos), 1);
2009
+ if ($rtnVal and $trailer) {
2010
+ # are we deleting the trailer?
2011
+ my $nvTrail = $et->GetNewValueHash($Image::ExifTool::Extra{Trailer});
2012
+ if ($$et{DEL_GROUP}{Trailer} or ($nvTrail and not ($$nvTrail{Value} and $$nvTrail{Value}[0]))) {
2013
+ $et->Warn("Deleted $$trailer[0] trailer", 1);
2014
+ } elsif ($raf->Seek($$trailer[1])) {
2015
+ $et->Warn(sprintf('Copying %s trailer from offset 0x%x', @$trailer), 1);
2017
2016
  while ($raf->Read($buf2, 65536)) {
2018
2017
  Write($outfile, $buf2) or $rtnVal = 0, last;
2019
2018
  }
2020
2019
  } else {
2021
- $et->Error('Error copying Insta360 trailer');
2022
2020
  $rtnVal = 0;
2023
2021
  }
2022
+ $rtnVal or $et->Error("Error copying $$trailer[0] trailer");
2024
2023
  }
2025
2024
  return $rtnVal;
2026
2025
  }
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars $advFmtSelf);
31
31
 
32
- $VERSION = '12.95';
32
+ $VERSION = '12.96';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.95
3
+ Version: 12.96
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('12.95.0')
4
+ VERSION = Gem::Version.new('12.96.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.95.0
4
+ version: 12.96.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-08-31 00:00:00.000000000 Z
12
+ date: 2024-09-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool