exiftool_vendored 12.95.0 → 12.96.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.
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