exiftool_vendored 12.89.0 → 12.92.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: 7df2d0fa28308f9ca1e01281f5adb79fb0c7f8a10837bb8bed04119b8176e411
4
- data.tar.gz: c957dcea2b7c27b85bb0dcf947655291551f1d6c9ed60a341c308530e6bf4319
3
+ metadata.gz: f86c2dcf64db70e03d4758fcba7dd1a711528fee369de76762474f076018d779
4
+ data.tar.gz: e21c4bebc90dee50fa43ee7b7d9fb4aa84ca699ce1403eb18011454bfc34e201
5
5
  SHA512:
6
- metadata.gz: a5b8e76b963736b502f09c43b1d1d1c3b40533460763e432a5aa0a56151bdda4e5bdaedae95f5a6e7b881437855bee2b9154a88b2c062f7c61a4b0c8f1e4b780
7
- data.tar.gz: a60d7c3d8736f5edd2da67b517880e13a23fd201eefe66774afdeff76a9050055c45e00fe296f21d771d0f193471e807c3608ca79742b14dbe6bd2ce3c20d08f
6
+ metadata.gz: 2189eadffa5201003f5247c0c97a3dc0cc5f26ff0fbac13a49691bee0bd779656c07be72fbc4803b1a3cc98bcf8cdad79e314d551cdd893fb789f2c929f7790d
7
+ data.tar.gz: aa2912573a6781d7d087e3b8449ea85841f6484c3cd3b8ba378e60fb5df49a3f485a6a74fceb705052cc565cb561043faca5ce970f4be3e71ef20d342b48af09
data/bin/Changes CHANGED
@@ -7,6 +7,28 @@ 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
+ July 24, 2024 - Version 12.92
11
+
12
+ - Removed -w from exiftool shebang
13
+
14
+ July 24, 2024 - Version 12.91
15
+
16
+ - Fixed 2 test files that were causing failed tests (ExifTool itself is
17
+ unchanged)
18
+
19
+ July 24, 2024 - Version 12.90
20
+
21
+ - Added support for reading Samsung trailer from PNG images
22
+ - Decode two more formats of timed GPS from MP4 videos
23
+ - Decode a few more Samung trailer tags (thanks Neal Krawetz)
24
+ - Decode Canon AntiFlicker tag
25
+ - Drop Nikon ShotInfo record when copying MakerNotes from NEF to JPG if it is
26
+ larger than 50000 bytes (then MakerNotes would be too large for a single
27
+ JPEG segment)
28
+ - Changed exiftool shebang from "#!/usr/bin/perl" to "#!/usr/bin/env perl"
29
+ - Revert change of 12.84 to iterate through sub-documents with the -p option
30
+ only if -ee is used
31
+
10
32
  July 12, 2024 - Version 12.89
11
33
 
12
34
  - Added new Sony lenses and updated decoding of some tags (thanks Jos Roost)
@@ -15,9 +37,7 @@ July 12, 2024 - Version 12.89
15
37
 
16
38
  July 11, 2024 - Version 12.88 - "New Windows/MacOS packages"
17
39
 
18
- -
19
-
20
- NOTE: The install procedure for the Windows executable has changed!
40
+ - NOTE: The install procedure for the Windows executable has changed!
21
41
  - Windows EXE version now uses Oliver Betz's bundle with Strawberry Perl and
22
42
  comes in 32- and 64-bit versions
23
43
  - MacOS distribution now uses a flattened package
@@ -105,6 +125,8 @@ Apr. 23, 2024 - Version 12.84
105
125
  cities
106
126
  - Allow coordinates to be entered without comma separator for the Geolocation
107
127
  feature as long as both coordinates have a decimal point
128
+ - Changed -p option to iterate through sub-documents if they exist even if -ee
129
+ isn't used
108
130
  - Fixed long-standing bug in Windows version that didn't properly handle dates
109
131
  older than 50 years when writing FileModifyDate or FileCreateDate
110
132
  - Fixed API TimeZone option to work in Windows
data/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.89"
53
+ "version" : "12.92"
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.89'
34
+ version: '12.92'
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.89.tar.gz | tar -xf -
113
- cd Image-ExifTool-12.89
112
+ gzip -dc Image-ExifTool-12.92.tar.gz | tar -xf -
113
+ cd Image-ExifTool-12.92
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
@@ -1,4 +1,4 @@
1
- #!/usr/bin/perl -w
1
+ #!/usr/bin/env perl
2
2
  #-------------------------------------------------------------------------------
3
3
  # File: build_geolocation
4
4
  #
data/bin/exiftool CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/perl -w
1
+ #!/usr/bin/env perl
2
2
  #------------------------------------------------------------------------------
3
3
  # File: exiftool
4
4
  #
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.89';
14
+ my $version = '12.92';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -2310,8 +2310,8 @@ sub GetImageInfo($$)
2310
2310
  # output using print format file (-p) option
2311
2311
  my ($type, $doc, $grp, $lastDoc, $cache);
2312
2312
  $fileTrailer = '';
2313
- # repeat for each sub-document if necessary
2314
- if ($$et{DOC_COUNT}) {
2313
+ # repeat for each embedded document if necessary (only if -ee used)
2314
+ if ($et->Options('ExtractEmbedded')) {
2315
2315
  # (cache tag keys if there are sub-documents)
2316
2316
  $lastDoc = $$et{DOC_COUNT} and $cache = { };
2317
2317
  } else {
@@ -5684,7 +5684,7 @@ with this command:
5684
5684
 
5685
5685
  produces output like this:
5686
5686
 
5687
- -- Generated by ExifTool 12.89 --
5687
+ -- Generated by ExifTool 12.92 --
5688
5688
  File: a.jpg - 2003:10:31 15:44:19
5689
5689
  (f/5.6, 1/60s, ISO 100)
5690
5690
  File: b.jpg - 2006:05:23 11:57:38
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.78';
91
+ $VERSION = '4.79';
92
92
 
93
93
  # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
94
94
  # (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -6403,6 +6403,8 @@ my %ciMaxFocal = (
6403
6403
  12 => 'Flexizone Multi (9 point)', #PH (750D, 9 points)
6404
6404
  13 => 'Flexizone Single', #PH (EOS M default, live view) (R7 calls this '1-point AF', ref github268)
6405
6405
  14 => 'Large Zone AF', #PH/forum6237 (7DmkII)
6406
+ 16 => 'Large Zone AF (vertical)', #forum16223
6407
+ 17 => 'Large Zone AF (horizontal)', #forum16223
6406
6408
  19 => 'Flexible Zone AF 1', #github268 (R7)
6407
6409
  20 => 'Flexible Zone AF 2', #github268 (R7)
6408
6410
  21 => 'Flexible Zone AF 3', #github268 (R7)
@@ -6921,6 +6923,10 @@ my %ciMaxFocal = (
6921
6923
  Name => 'FlashExposureLock',
6922
6924
  PrintConv => \%offOn,
6923
6925
  },
6926
+ 32 => { #forum16257
6927
+ Name => 'AntiFlicker',
6928
+ PrintConv => \%offOn,
6929
+ },
6924
6930
  0x3d => { #IB
6925
6931
  Name => 'RFLensType',
6926
6932
  Format => 'int16u',
@@ -9123,19 +9129,19 @@ my %filterConv = (
9123
9129
  2 => 'Disable',
9124
9130
  },
9125
9131
  },
9126
- 18 => { #52
9132
+ 18 => { #52/forum16223
9127
9133
  Name => 'AFStatusViewfinder',
9128
- Condition => '$$self{Model} =~ /1D X/',
9129
- Notes => '1D X only',
9134
+ Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
9135
+ Notes => '1D X and R models',
9130
9136
  PrintConv => {
9131
9137
  0 => 'Show in Field of View',
9132
9138
  1 => 'Show Outside View',
9133
9139
  },
9134
9140
  },
9135
- 19 => { #52
9141
+ 19 => { #52/forum16223
9136
9142
  Name => 'InitialAFPointInServo',
9137
- Condition => '$$self{Model} =~ /1D X/',
9138
- Notes => '1D X only',
9143
+ Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
9144
+ Notes => '1D X and R models',
9139
9145
  PrintConv => {
9140
9146
  0 => 'Initial AF Point Selected',
9141
9147
  1 => 'Manual AF Point',
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
65
65
  use Image::ExifTool::GPS;
66
66
  use Image::ExifTool::XMP;
67
67
 
68
- $VERSION = '4.35';
68
+ $VERSION = '4.36';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -2495,6 +2495,7 @@ my %base64coord = (
2495
2495
  { # D7100=0227
2496
2496
  Condition => '$$valPt =~ /^0[28]/',
2497
2497
  Name => 'ShotInfo02xx',
2498
+ Drop => 50000, # drop if too large (>64k for Z6iii)
2498
2499
  SubDirectory => {
2499
2500
  TagTable => 'Image::ExifTool::Nikon::ShotInfo',
2500
2501
  ProcessProc => \&ProcessNikonEncrypted,
@@ -5635,6 +5636,38 @@ my %nikonFocalConversions = (
5635
5636
  Notes => 'P6000',
5636
5637
  PrintConv => \%offOn,
5637
5638
  },
5639
+ # for Nikon Z6iii JPG and RAW images (version 0809),
5640
+ # the offset table starts at 0x24 and is as follows
5641
+ # JPG Offset Size NEF Offset Size
5642
+ # 0) 0x0000 0 0) 0x009c 21604
5643
+ # 1) 0x0000 0 1) 0x5500 6008
5644
+ # 2) 0x009c 2528 2) 0x6c78 2528
5645
+ # 3) 0x0a7c 200 3) 0x7658 200
5646
+ # 4) 0x0b44 2488 4) 0x7720 2488
5647
+ # 5) 0x14fc 1468 5) 0x80d8 1468
5648
+ # 6) 0x1ab8 1032 6) 0x8694 1032
5649
+ # 7) 0x1ec0 256 7) 0x8a9c 256
5650
+ # 8) 0x1fc0 800 8) 0x8b9c 800
5651
+ # 9) 0x22e0 144 9) 0x8ebc 144
5652
+ # 10) 0x2370 64 10) 0x8f4c 64
5653
+ # 11) 0x0000 0 11) 0x0000 0
5654
+ # 12) 0x23b0 5009 12) 0x8f8c 5009
5655
+ # 13) 0x3741 1536 13) 0xa31d 1536
5656
+ # 14) 0x3d41 11928 14) 0xa91d 11928
5657
+ # 15) 0x6bd9 5937 15) 0xd7b5 5937
5658
+ # 16) 0x830a 500 16) 0xeee6 500
5659
+ # 17) 0x84fe 160 17) 0xf0da 160
5660
+ # 18) 0x859e 464 18) 0xf17a 464
5661
+ # 19) 0x876e 8 19) 0xf34a 8
5662
+ # 20) 0x8776 64 20) 0xf352 64
5663
+ # 21) 0x87b6 6 21) 0xf392 6
5664
+ # 22) 0x87bc 48 22) 0xf398 48
5665
+ # 23) 0x87ec 20 23) 0xf3c8 20
5666
+ # 24) 0x8800 108 24) 0xf3dc 108
5667
+ # 25) 0x886c 8 25) 0xf448 8
5668
+ # 26) 0x8874 2420 26) 0xf450 2420
5669
+ # 27) 0x0000 0 27) 0x0000 0
5670
+ # 28) 0x0000 0 28) 0x0000 0
5638
5671
  0x66 => {
5639
5672
  Name => 'VR_0x66',
5640
5673
  Condition => '$$self{ShotInfoVersion} eq "0204"',
@@ -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.67';
39
+ $VERSION = '1.68';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -1400,7 +1400,7 @@ sub ProcessPNG($$)
1400
1400
  my $fastScan = $et->Options('FastScan');
1401
1401
  my $hash = $$et{ImageDataHash};
1402
1402
  my ($n, $sig, $err, $hbuf, $dbuf, $cbuf);
1403
- my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset);
1403
+ my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset, $wasTrailer);
1404
1404
 
1405
1405
  # check to be sure this is a valid PNG/MNG/JNG image
1406
1406
  return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig};
@@ -1461,6 +1461,7 @@ sub ProcessPNG($$)
1461
1461
  if ($wasEnd) {
1462
1462
  last unless $n; # stop now if normal end of PNG
1463
1463
  $et->WarnOnce("Trailer data after $fileType $endChunk chunk", 1);
1464
+ $wasTrailer = 1;
1464
1465
  last if $n < 8;
1465
1466
  $$et{SET_GROUP1} = 'Trailer';
1466
1467
  } elsif ($n != 8) {
@@ -1654,6 +1655,13 @@ sub ProcessPNG($$)
1654
1655
  }
1655
1656
  }
1656
1657
  delete $$et{SET_GROUP1};
1658
+ # read Samsung trailer if it exists
1659
+ if ($wasTrailer and not $outfile and $raf->Seek(-8, 2) and
1660
+ $raf->Read($dbuf,8) and $dbuf =~ /\0\0(QDIOBS|SEFT)$/) # (have only seen SEFT type)
1661
+ {
1662
+ require Image::ExifTool::Samsung;
1663
+ Image::ExifTool::Samsung::ProcessSamsung($et, { DirName => 'Samsung', RAF => $raf });
1664
+ }
1657
1665
  return -1 if $outfile and ($err or not $wasEnd);
1658
1666
  return 1; # this was a valid PNG/MNG/JNG image
1659
1667
  }
@@ -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 = '2.98';
51
+ $VERSION = '2.99';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -9737,7 +9737,7 @@ sub ProcessMOV($$;$)
9737
9737
  if ($size > 0x2000000) { # start to get worried above 32 MiB
9738
9738
  # check for RIFF trailer (written by Auto-Vox dashcam)
9739
9739
  if ($buff =~ /^(gpsa|gps0|gsen|gsea)...\0/s) { # (yet seen only gpsa as first record)
9740
- $et->VPrint(0, "Found RIFF trailer");
9740
+ $et->VPrint(0, sprintf("Found RIFF trailer at offset 0x%x",$lastPos));
9741
9741
  if ($et->Options('ExtractEmbedded')) {
9742
9742
  $raf->Seek(-8, 1) or last; # seek back to start of trailer
9743
9743
  my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
@@ -9746,6 +9746,11 @@ sub ProcessMOV($$;$)
9746
9746
  EEWarn($et);
9747
9747
  }
9748
9748
  last;
9749
+ } elsif ($buff eq 'CCCCCCCC') {
9750
+ $et->VPrint(0, sprintf("Found Kenwood trailer at offset 0x%x",$lastPos));
9751
+ my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
9752
+ ProcessKenwoodTrailer($et, { RAF => $raf }, $tbl);
9753
+ last;
9749
9754
  }
9750
9755
  $ignore = 1;
9751
9756
  if ($tagInfo and not $$tagInfo{Unknown} and not $eeTag) {
@@ -109,7 +109,7 @@ my %insvLimit = (
109
109
  The tags below are extracted from timed metadata in QuickTime and other
110
110
  formats of video files when the ExtractEmbedded option is used. Although
111
111
  most of these tags are combined into the single table below, ExifTool
112
- currently reads 74 different formats of timed GPS metadata from video files.
112
+ currently reads 76 different formats of timed GPS metadata from video files.
113
113
  },
114
114
  VARS => { NO_ID => 1 },
115
115
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -1420,9 +1420,10 @@ Sample: for ($i=0; ; ) {
1420
1420
  } elsif ($type eq 'gps ') { # (ie. GPSDataList tag)
1421
1421
 
1422
1422
  if ($buff =~ /^....freeGPS /s) {
1423
- # process by brute scan instead if ExtractEmbedded >= 3
1424
- # (some videos don't reference all freeGPS info from 'gps ' table, eg. INNOV)
1425
- last if $eeOpt >= 3;
1423
+ # parse freeGPS data unless done already in brute-force scan
1424
+ # (some videos don't reference all freeGPS info from 'gps ' table, eg. INNOV,
1425
+ # and some videos don't put 'gps ' data in mdat, eg XGODY 12" 4K Dashcam)
1426
+ last if $$et{FoundGPSByScan};
1426
1427
  # decode "freeGPS " data (Novatek and others)
1427
1428
  ProcessFreeGPS($et, {
1428
1429
  DataPt => \$buff,
@@ -2049,9 +2050,41 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2049
2050
  }
2050
2051
  }
2051
2052
 
2052
- } else {
2053
+ } elsif ($$dataPt =~ m<^.{23}(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2}) [N|S]>s) {
2053
2054
 
2054
2055
  $debug and $et->FoundTag(GPSType => 16);
2056
+ # XGODY 12" 4K Dashcam
2057
+ # 0000: 00 00 00 a8 66 72 65 65 47 50 53 20 98 00 00 00 [....freeGPS ....]
2058
+ # 0010: 6e 6f 72 6d 61 6c 3a 32 30 32 34 2f 30 35 2f 32 [normal:2024/05/2]
2059
+ # 0020: 32 20 30 32 3a 35 34 3a 32 39 20 4e 3a 34 32 2e [2 02:54:29 N:42.]
2060
+ # 0030: 33 38 32 34 37 30 20 57 3a 38 33 2e 33 38 39 35 [382470 W:83.3895]
2061
+ # 0040: 37 30 20 35 33 2e 36 20 6b 6d 2f 68 20 78 3a 2d [70 53.6 km/h x:-]
2062
+ # 0050: 30 2e 30 32 20 79 3a 30 2e 39 39 20 7a 3a 30 2e [0.02 y:0.99 z:0.]
2063
+ # 0060: 31 30 20 41 3a 32 36 39 2e 32 20 48 3a 32 34 35 [10 A:269.2 H:245]
2064
+ # 0070: 2e 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [.5..............]
2065
+ ($yr,$mon,$day,$hr,$min,$sec) = ($1,$2,$3,$4,$5,$6);
2066
+ $$dataPt =~ s/\0+$//; # remove trailing nulls
2067
+ my @a = split ' ', substr($$dataPt,43);
2068
+ $ddd = 1;
2069
+ foreach (@a) {
2070
+ unless (/^([A-Z]):([-+]?\d+(\.\d+)?)$/i) {
2071
+ # (the "km/h" after spd is display units? because the value is stored in knots)
2072
+ defined $lon and not defined $spd and /^\d+\.\d+$/ and $spd = $_ * $knotsToKph;
2073
+ next;
2074
+ }
2075
+ ($1 eq 'N' or $1 eq 'S') and $lat = $2, $latRef = $1, next;
2076
+ ($1 eq 'E' or $1 eq 'W') and $lon = $2, $lonRef = $1, next;
2077
+ ($1 eq 'x' or $1 eq 'y' or $1 eq 'z') and push(@acc,$2), next;
2078
+ $1 eq 'A' and $trk = $2, next; # (verified, but why 'A'?)
2079
+ # seen 'H' - one might expect altitude ('H'eight), but it doesn't fit
2080
+ # the sample data, so save all other information as an "Unknown_X" tag
2081
+ $$tagTbl{$1} or AddTagToTable($tagTbl, $1, { Name => "Unknown_$1", Unknown => 1 });
2082
+ push(@xtra, $1 => $2), next;
2083
+ }
2084
+
2085
+ } else {
2086
+
2087
+ $debug and $et->FoundTag(GPSType => 17);
2055
2088
  # (look for binary GPS as stored by Nextbase 512G, ref PH)
2056
2089
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...]
2057
2090
  # 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
@@ -2115,7 +2148,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2115
2148
  my $time = sprintf('%.2d:%.2d:%sZ',$hr,$min,$sec);
2116
2149
  $et->HandleTag($tagTbl, GPSTimeStamp => $time);
2117
2150
  }
2118
- if (defined $lat) {
2151
+ if (defined $lat and defined $lon) {
2119
2152
  # lat/long are in DDDMM.MMMM format unless $ddd is set
2120
2153
  ConvertLatLon($lat, $lon) unless $ddd;
2121
2154
  $et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
@@ -2680,6 +2713,53 @@ sub ProcessRIFFTrailer($$$)
2680
2713
  return 1;
2681
2714
  }
2682
2715
 
2716
+ #------------------------------------------------------------------------------
2717
+ # Process Kenwood Dashcam trailer (forum16229)
2718
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
2719
+ # Returns: 1 on success
2720
+ # Sample data (chained 512-byte records starting like this):
2721
+ # 0000: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 47 50 [CCCCCCCCCCCCCCGP]
2722
+ # 0010: 53 44 41 54 41 2d 2d 32 30 32 34 30 37 31 31 31 [SDATA--202407111]
2723
+ # 0020: 32 30 34 31 32 4e 35 30 2e 36 31 32 33 38 36 30 [20412N50.6123860]
2724
+ # 0030: 36 37 37 45 38 2e 37 30 32 37 31 38 30 39 38 39 [677E8.7027180989]
2725
+ # 0040: 35 33 33 2e 30 30 30 30 30 30 30 30 30 30 30 30 [533.000000000000]
2726
+ # 0050: 2e 30 30 30 30 30 30 30 30 30 30 30 30 30 2e 30 [.0000000000000.0]
2727
+ # 0060: 31 39 39 39 39 39 39 39 35 35 33 2d 30 2e 30 39 [19999999553-0.09]
2728
+ # 0070: 30 30 30 30 30 30 33 35 37 2d 30 2e 31 34 30 30 [000000357-0.1400]
2729
+ # 0080: 30 30 30 30 30 35 39 47 50 53 44 41 54 41 2d 2d [0000059GPSDATA--]
2730
+ sub ProcessKenwoodTrailer($$$)
2731
+ {
2732
+ my ($et, $dirInfo, $tagTbl) = @_;
2733
+ my $raf = $$dirInfo{RAF};
2734
+ my $buff;
2735
+ # current file position is 8 bytes into the 14 C's, so test the next 6:
2736
+ $raf->Read($buff, 14) and $buff eq 'CCCCCCCCCCCCCC' or return 0;
2737
+ $et->VerboseDir('Kenwood trailer', undef, undef);
2738
+ unless ($$et{OPTIONS}{ExtractEmbedded}) {
2739
+ $et->WarnOnce('Use the ExtractEmbedded option to extract timed GPSData from Kenwood trailer',3);
2740
+ return 1;
2741
+ }
2742
+ while ($raf->Read($buff, 121) and $buff =~ /^GPSDATA--(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/) {
2743
+ FoundSomething($et, $tagTbl);
2744
+ $et->HandleTag($tagTbl, GPSDateTime => "$1:$2:$3 $4:$5:$6");
2745
+ my $i = 9 + 14;
2746
+ my ($val, @acc, $tag);
2747
+ foreach $tag (qw(GPSLatitude GPSLongitude GPSSpeed unk acc acc acc)) {
2748
+ $val = substr($buff, $i, 14); $i += 14;
2749
+ next if $tag eq 'unk';
2750
+ my $hemi;
2751
+ $hemi = $1 if $val =~ s/^([NSEW])//;
2752
+ $val =~ /^[-+]?\d+\.\d+$/ or next;
2753
+ $tag eq 'acc' and push(@acc,$val), next;
2754
+ $val = -$val if $hemi and ($hemi eq 'S' or $hemi eq 'W');
2755
+ $et->HandleTag($tagTbl, $tag => $val);
2756
+ }
2757
+ $et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc == 3;
2758
+ }
2759
+ delete $$et{DOC_NUM};
2760
+ return 1;
2761
+ }
2762
+
2683
2763
  #------------------------------------------------------------------------------
2684
2764
  # Process 'gps ' atom containing NMEA from Pittasoft Blackvue dashcam (ref PH)
2685
2765
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -3353,6 +3433,7 @@ sub ScanMediaData($)
3353
3433
  }
3354
3434
  my $dirInfo = { DataPt => \$buff, DataPos => $pos + $dataPos, DirLen => $len };
3355
3435
  ProcessFreeGPS($et, $dirInfo, $tagTbl);
3436
+ $$et{FoundGPSByScan} = 1;
3356
3437
  }
3357
3438
  $pos += $len;
3358
3439
  $buf2 = substr($buff, $len);
@@ -22,13 +22,13 @@ use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
24
 
25
- $VERSION = '1.56';
25
+ $VERSION = '1.57';
26
26
 
27
27
  sub WriteSTMN($$$);
28
28
  sub ProcessINFO($$$);
29
29
  sub ProcessSamsungMeta($$$);
30
30
  sub ProcessSamsungIFD($$$);
31
- sub ProcessSamsung($$$);
31
+ sub ProcessSamsung($$;$);
32
32
 
33
33
  # Samsung LensType lookup
34
34
  %samsungLensTypes = (
@@ -943,25 +943,25 @@ my %formatMinMax = (
943
943
  );
944
944
 
945
945
  # information extracted from Samsung trailer (ie. Samsung SM-T805 "Sound & Shot" JPEG) (ref PH)
946
+ # NOTE: These tags may use $$self{SamsungTagName} in a Condition statement
947
+ # if necessary to differentiate tags with the same ID but different names
946
948
  %Image::ExifTool::Samsung::Trailer = (
947
949
  GROUPS => { 0 => 'MakerNotes', 2 => 'Other' },
948
950
  VARS => { NO_ID => 1, HEX_ID => 0 },
949
951
  PROCESS_PROC => \&ProcessSamsung,
952
+ TAG_PREFIX => 'SamsungTrailer',
950
953
  PRIORITY => 0, # (first one takes priority so DepthMapWidth/Height match first DepthMapData)
951
954
  NOTES => q{
952
- Tags extracted from the trailer of JPEG images written when using certain
953
- features (such as "Sound & Shot" or "Shot & More") from Samsung models such
954
- as the Galaxy S4 and Tab S, and from the 'sefd' atom in HEIC images from the
955
- Samsung S10+.
956
- },
957
- '0x0001-name' => {
958
- Name => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
959
- RawConv => '$$self{EmbeddedImageName} = $val',
955
+ Tags extracted from the SEFT trailer of JPEG and PNG images written when
956
+ using certain features (such as "Sound & Shot" or "Shot & More") from
957
+ Samsung models such as the Galaxy S4 and Tab S, and from the 'sefd' atom in
958
+ HEIC images from models such as the S10+.
960
959
  },
960
+ '0x0001-name' => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
961
961
  '0x0001' => [
962
962
  {
963
963
  Name => 'EmbeddedImage',
964
- Condition => '$$self{EmbeddedImageName} eq "DualShot_1"',
964
+ Condition => '$$self{SamsungTagName} ne "DualShot_2"',
965
965
  Groups => { 2 => 'Preview' },
966
966
  Binary => 1,
967
967
  },
@@ -1277,8 +1277,10 @@ my %formatMinMax = (
1277
1277
  # 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
1278
1278
  # 0x0be0-name - seen 'Livefocus_JDM_Info' #forum16086
1279
1279
  # 0x0bf0-name - seen 'Remaster_Info' #forum16086
1280
+ '0x0bf0' => 'RemasterInfo', #forum16086/16242
1280
1281
  # 0x0c21-name - seen 'Portrait_Effect_Info' #forum16086
1281
1282
  # 0x0c51-name - seen 'Samsung_Capture_Info' #forum16086
1283
+ '0x0c51' => 'SamsungCaptureInfo', #forum16086/16242
1282
1284
  # 0x0c61-name - seen 'Camera_Capture_Mode_Info' #forum16086
1283
1285
  # 0x0c71-name - seen 'Pro_White_Balance_Info' #forum16086
1284
1286
  # 0x0c81-name - seen 'Watermark_Info' #forum16086
@@ -1289,7 +1291,11 @@ my %formatMinMax = (
1289
1291
  # 0x0d11-name - seen 'Video_Snapshot_Info' #forum16086
1290
1292
  # 0x0d21-name - seen 'Camera_Scene_Info' #forum16086
1291
1293
  # 0x0d31-name - seen 'Food_Blur_Effect_Info' #forum16086
1292
- # 0x0d91-name - seen 'PEg_Info' #forum16086
1294
+ '0x0d91' => { #forum16086/16242
1295
+ Name => 'PEg_Info',
1296
+ Description => 'PEg Info',
1297
+ SubDirectory => { TagTable => 'Image::ExifTool::JSON::Main' },
1298
+ },
1293
1299
  # 0x0da1-name - seen 'Captured_App_Info' #forum16086
1294
1300
  # 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
1295
1301
  # 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360)
@@ -1563,7 +1569,7 @@ sub ProcessSamsungIFD($$$)
1563
1569
  # Returns: 1 on success, 0 not valid Samsung trailer, or -1 error writing
1564
1570
  # - updates DataPos to point to start of Samsung trailer
1565
1571
  # - updates DirLen to existing trailer length
1566
- sub ProcessSamsung($$$)
1572
+ sub ProcessSamsung($$;$)
1567
1573
  {
1568
1574
  my ($et, $dirInfo) = @_;
1569
1575
  my $raf = $$dirInfo{RAF};
@@ -1653,8 +1659,13 @@ SamBlock:
1653
1659
  $audioSize = $size - 8 - $len;
1654
1660
  next;
1655
1661
  }
1656
- # add unknown tags if necessary
1662
+ last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, $size) == $size;
1663
+ # (could validate the first 4 bytes of the block because they
1664
+ # are the same as the first 4 bytes of the directory entry)
1665
+ $len = Get32u(\$buf2, 4);
1666
+ last if $len + 8 > $size;
1657
1667
  my $tag = sprintf("0x%.4x", $type);
1668
+ # add unknown tags if necessary
1658
1669
  unless ($$tagTablePtr{$tag}) {
1659
1670
  next unless $unknown or $verbose;
1660
1671
  my %tagInfo = (
@@ -1673,11 +1684,8 @@ SamBlock:
1673
1684
  );
1674
1685
  AddTagToTable($tagTablePtr, "$tag-name", \%tagInfo2);
1675
1686
  }
1676
- last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, $size) == $size;
1677
- # (could validate the first 4 bytes of the block because they
1678
- # are the same as the first 4 bytes of the directory entry)
1679
- $len = Get32u(\$buf2, 4);
1680
- last if $len + 8 > $size;
1687
+ # set SamsungTagName ExifTool member for use in tag Condition
1688
+ $$et{SamsungTagName} = substr($buf2, 8, $len);
1681
1689
  # extract tag name and value
1682
1690
  $et->HandleTag($tagTablePtr, "$tag-name", undef,
1683
1691
  DataPt => \$buf2,
@@ -1691,6 +1699,7 @@ SamBlock:
1691
1699
  Start => 8 + $len,
1692
1700
  Size => $size - (8 + $len),
1693
1701
  );
1702
+ delete $$et{SamsungTagName};
1694
1703
  }
1695
1704
  if ($outfile) {
1696
1705
  last unless $raf->Seek($dataPos, 0) and $raf->Read($buff, $dirLen) == $dirLen;
@@ -997,6 +997,7 @@ my %tagLookup = (
997
997
  'angleinfoyaw' => { 510 => 'AngleInfoYaw' },
998
998
  'anti-blur' => { 451 => 0xb04b },
999
999
  'antialiasstrength' => { 123 => 0xc632 },
1000
+ 'antiflicker' => { 59 => 0x20 },
1000
1001
  'aperturelock' => { 306 => '38.2', 308 => '38.2', 309 => '38.2', 318 => '38.2', 319 => '38.2', 321 => 0xb8, 322 => 0xb8, 323 => 0xb8 },
1001
1002
  'aperturemode' => { 410 => 'apmd' },
1002
1003
  'aperturerange' => { 88 => 0x10d },
@@ -11290,6 +11291,7 @@ my %tagExists = (
11290
11291
  'peakspectralsensitivity' => 1,
11291
11292
  'peakvalue' => 1,
11292
11293
  'pefversion' => 1,
11294
+ 'peg_info' => 1,
11293
11295
  'pentax' => 1,
11294
11296
  'pentaxdata' => 1,
11295
11297
  'pentaxdata2' => 1,
@@ -11750,6 +11752,7 @@ my %tagExists = (
11750
11752
  'releasedateyearmonth' => 1,
11751
11753
  'releasedateyearmonthday' => 1,
11752
11754
  'releasinginstructions' => 1,
11755
+ 'remasterinfo' => 1,
11753
11756
  'rembrandtconsumertonescale' => 1,
11754
11757
  'rembrandtportraittonescale' => 1,
11755
11758
  'rembrandttonescale' => 1,
@@ -11915,6 +11918,7 @@ my %tagExists = (
11915
11918
  'sampletochunk' => 1,
11916
11919
  'sampletogroup' => 1,
11917
11920
  'samsung' => 1,
11921
+ 'samsungcaptureinfo' => 1,
11918
11922
  'samsungifd' => 1,
11919
11923
  'samsunginfo' => 1,
11920
11924
  'samsungmodel' => 1,
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 27892 tags, with 17459 unique tag names.
15
+ They contain a total of 27895 tags, with 17462 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -10476,6 +10476,7 @@ WB tags for the Canon G9.
10476
10476
  21 FocusDistanceLower int16u
10477
10477
  23 ShutterMode int16s
10478
10478
  25 FlashExposureLock int16s
10479
+ 32 AntiFlicker int16s
10479
10480
  61 RFLensType int16u
10480
10481
 
10481
10482
  =head3 Canon SerialInfo Tags
@@ -20869,10 +20870,10 @@ Camera orientation information written by the Gear 360 (SM-C200).
20869
20870
 
20870
20871
  =head3 Samsung Trailer Tags
20871
20872
 
20872
- Tags extracted from the trailer of JPEG images written when using certain
20873
- features (such as "Sound & Shot" or "Shot & More") from Samsung models such
20874
- as the Galaxy S4 and Tab S, and from the 'sefd' atom in HEIC images from the
20875
- Samsung S10+.
20873
+ Tags extracted from the SEFT trailer of JPEG and PNG images written when
20874
+ using certain features (such as "Sound & Shot" or "Shot & More") from
20875
+ Samsung models such as the Galaxy S4 and Tab S, and from the 'sefd' atom in
20876
+ HEIC images from models such as the S10+.
20876
20877
 
20877
20878
  Tag Name Writable
20878
20879
  -------- --------
@@ -20890,6 +20891,9 @@ Samsung S10+.
20890
20891
  EmbeddedVideoFile no
20891
20892
  EmbeddedVideoType no
20892
20893
  MCCData no
20894
+ PEg_Info JSON
20895
+ RemasterInfo no
20896
+ SamsungCaptureInfo no
20893
20897
  SingleShotDepthMap no
20894
20898
  SingleShotMeta Samsung SingleShotMeta
20895
20899
  SurroundShotVideo no
@@ -29614,7 +29618,7 @@ for the official QuickTime specification.
29614
29618
  The tags below are extracted from timed metadata in QuickTime and other
29615
29619
  formats of video files when the ExtractEmbedded option is used. Although
29616
29620
  most of these tags are combined into the single table below, ExifTool
29617
- currently reads 74 different formats of timed GPS metadata from video files.
29621
+ currently reads 76 different formats of timed GPS metadata from video files.
29618
29622
 
29619
29623
  Tag Name Writable
29620
29624
  -------- --------
@@ -536,7 +536,7 @@ sub WriteItemInfo($$$)
536
536
  my $comp = $et->Options('Compress');
537
537
  if (defined $comp and ($comp xor $$item{ContentEncoding})) {
538
538
  #TODO: add ability to edit infe entry in iinf to change encoding according to Compress option if set
539
- $et->Warn("Can't currently change compression when rewriting $name in HEIC");
539
+ $et->Warn("Can't currently change compression when rewriting $name in HEIC",1);
540
540
  }
541
541
  my $wasDeflated;
542
542
  if ($$item{ContentEncoding}) {
@@ -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.89';
32
+ $VERSION = '12.92';
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.89
3
+ Version: 12.92
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.89.0')
4
+ VERSION = Gem::Version.new('12.92.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.89.0
4
+ version: 12.92.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-07-18 00:00:00.000000000 Z
12
+ date: 2024-07-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool