exiftool_vendored 11.52.0 → 11.53.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +21 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +2 -2
- data/bin/lib/Image/ExifTool.pm +45 -21
- data/bin/lib/Image/ExifTool.pod +3 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +3 -3
- data/bin/lib/Image/ExifTool/Exif.pm +71 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +3 -1
- data/bin/lib/Image/ExifTool/GoPro.pm +13 -11
- data/bin/lib/Image/ExifTool/JPEG.pm +4 -0
- data/bin/lib/Image/ExifTool/Nikon.pm +2 -3
- data/bin/lib/Image/ExifTool/RIFF.pm +39 -5
- data/bin/lib/Image/ExifTool/Samsung.pm +2 -1
- data/bin/lib/Image/ExifTool/Sony.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +7 -2
- data/bin/lib/Image/ExifTool/TagNames.pod +14 -5
- data/bin/lib/Image/ExifTool/Torrent.pm +7 -2
- data/bin/lib/Image/ExifTool/Validate.pm +11 -11
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +20 -6
- data/bin/lib/Image/ExifTool/WriteXMP.pl +4 -4
- data/bin/lib/Image/ExifTool/ZIP.pm +12 -4
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97fbb02d04f7a13c79740ef2c0ca3aa5397dbb8f
|
4
|
+
data.tar.gz: a0bdb72ec276cfc6612f9551fd78f681352f1853
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8771355f5818b9bb5720b8a3caa567b111fa6582120519746658e03135b3df367b4c861a9b40eb7c274d36e858ac96949c1c3e4063162a27251a85537853f72
|
7
|
+
data.tar.gz: 128d993de5cb91c2e8929893d8cc6481c446203de05f0f8807e41aaa3131a76152b34e825a36d472b98a7939fceb64234b298e0c01ecaf669f9261aee7975464
|
data/bin/Changes
CHANGED
@@ -7,11 +7,30 @@ RSS feed: http://owl.phy.queensu.ca/~phil/exiftool/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 11.50. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to CPAN.)
|
9
9
|
|
10
|
+
June 24, 2019 - Version 11.53 - "Exif 2.32"
|
11
|
+
|
12
|
+
- Added support for the new tags of the Exif 2.32 specification
|
13
|
+
- Added a new SamsungModelID (thanks LibRaw)
|
14
|
+
- Added warning if extracting ZIP file contents without the -a option
|
15
|
+
- Added ability to extract EmbeddedVideo from the trailer of Android JPEG
|
16
|
+
images with the ExtractEmbedded option
|
17
|
+
- Decode timed GPS from Cobra Dash Cam AVI videos
|
18
|
+
- Decode a new GoPro tag
|
19
|
+
- Enhanced -struct option to allow extraction of structured Torrent Info
|
20
|
+
- Improved error handling when an unexpected terminator is encountered while
|
21
|
+
writing a QuickTime-format file
|
22
|
+
- Renamed one of the Nikon Saturation tags to "SaturationAdj"
|
23
|
+
- Removed warning message when writing FujiFilm RAFVersion 0240 and 0261 files
|
24
|
+
- Fixed encoding problem when writing some QuickTime UserData tags with
|
25
|
+
strings containing special characters
|
26
|
+
- API Changes:
|
27
|
+
- Enhanced XMPShorthand option to add level 2
|
28
|
+
|
10
29
|
June 17, 2019 - Version 11.52
|
11
30
|
|
12
31
|
- Added a few new Nikon CropHiSpeed values (thanks Hayo Baan)
|
13
|
-
- Added a
|
14
|
-
- Fixed problem where
|
32
|
+
- Added a new Nikon LensID (thanks Yves)
|
33
|
+
- Fixed problem where reading a large, corrupt AIFF file may could take an
|
15
34
|
excessively long time
|
16
35
|
- API Changes:
|
17
36
|
- Enhanced Compact option to add levels 3, 4 and 5
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -104,8 +104,8 @@ your home directory, then you would type the following commands in a
|
|
104
104
|
terminal window to extract and run ExifTool:
|
105
105
|
|
106
106
|
cd ~/Desktop
|
107
|
-
gzip -dc Image-ExifTool-11.
|
108
|
-
cd Image-ExifTool-11.
|
107
|
+
gzip -dc Image-ExifTool-11.53.tar.gz | tar -xf -
|
108
|
+
cd Image-ExifTool-11.53
|
109
109
|
./exiftool t/images/ExifTool.jpg
|
110
110
|
|
111
111
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
use strict;
|
13
13
|
require 5.004;
|
14
14
|
|
15
|
-
my $version = '11.
|
15
|
+
my $version = '11.53';
|
16
16
|
|
17
17
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
18
18
|
my $exeDir;
|
@@ -5119,7 +5119,7 @@ with this command:
|
|
5119
5119
|
|
5120
5120
|
produces output like this:
|
5121
5121
|
|
5122
|
-
-- Generated by ExifTool 11.
|
5122
|
+
-- Generated by ExifTool 11.53 --
|
5123
5123
|
File: a.jpg - 2003:10:31 15:44:19
|
5124
5124
|
(f/5.6, 1/60s, ISO 100)
|
5125
5125
|
File: b.jpg - 2006:05:23 11:57:38
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
#
|
8
8
|
# Revisions: Nov. 12/2003 - P. Harvey Created
|
9
9
|
# (See html/history.html for revision history)
|
10
|
-
#
|
10
|
+
#2.32
|
11
11
|
# Legal: Copyright (c) 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
|
12
12
|
# This library is free software; you can redistribute it and/or
|
13
13
|
# modify it under the same terms as Perl itself.
|
@@ -27,7 +27,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
27
27
|
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
|
28
28
|
%jpegMarker %specialTags %fileTypeLookup);
|
29
29
|
|
30
|
-
$VERSION = '11.
|
30
|
+
$VERSION = '11.53';
|
31
31
|
$RELEASE = '';
|
32
32
|
@ISA = qw(Exporter);
|
33
33
|
%EXPORT_TAGS = (
|
@@ -1662,6 +1662,7 @@ my %systemTagsNotes = (
|
|
1662
1662
|
commas, eg. C<-ForceWrite=exif,xmp>
|
1663
1663
|
},
|
1664
1664
|
},
|
1665
|
+
EmbeddedVideo => { Groups => { 2 => 'Video' } },
|
1665
1666
|
);
|
1666
1667
|
|
1667
1668
|
# YCbCrSubSampling values (used by JPEG SOF, EXIF and XMP)
|
@@ -2108,7 +2109,7 @@ sub ClearOptions($)
|
|
2108
2109
|
CharsetPhotoshop => 'Latin', # internal encoding for Photoshop resource names
|
2109
2110
|
CharsetQuickTime => 'MacRoman', # internal QuickTime string encoding
|
2110
2111
|
CharsetRIFF => 0, # internal RIFF string encoding (0=default to Latin)
|
2111
|
-
Compact =>
|
2112
|
+
Compact => 0, # write compact XMP
|
2112
2113
|
Composite => 1, # flag to calculate Composite tags
|
2113
2114
|
Compress => undef, # flag to write new values as compressed if possible
|
2114
2115
|
CoordFormat => undef, # GPS lat/long coordinate format
|
@@ -5974,29 +5975,50 @@ sub ProcessJPEG($$)
|
|
5974
5975
|
# we are here because we are looking for trailer information
|
5975
5976
|
if ($wantTrailer) {
|
5976
5977
|
my $start = $$self{PreviewImageStart};
|
5977
|
-
if ($start) {
|
5978
|
+
if ($start or $$options{ExtractEmbedded}) {
|
5978
5979
|
my $buff;
|
5979
5980
|
# most previews start right after the JPEG EOI, but the Olympus E-20
|
5980
5981
|
# preview is 508 bytes into the trailer, the K-M Maxxum 7D preview is
|
5981
5982
|
# 979 bytes in, and Sony previews can start up to 32 kB into the trailer.
|
5982
5983
|
# (and Minolta and Sony previews can have a random first byte...)
|
5983
5984
|
my $scanLen = $$self{Make} =~ /Sony/i ? 65536 : 1024;
|
5984
|
-
if ($raf->Read($buff, $scanLen)
|
5985
|
-
|
5986
|
-
|
5987
|
-
|
5988
|
-
|
5989
|
-
|
5990
|
-
|
5991
|
-
|
5992
|
-
|
5993
|
-
|
5994
|
-
|
5995
|
-
|
5996
|
-
|
5997
|
-
|
5998
|
-
|
5999
|
-
|
5985
|
+
if ($raf->Read($buff, $scanLen)) {
|
5986
|
+
if ($buff =~ /^.{4}ftyp/s) {
|
5987
|
+
my $val;
|
5988
|
+
if ($raf->Seek(0,2)) {
|
5989
|
+
my $len = $raf->Tell() - $pos;
|
5990
|
+
if ($$options{Binary}) {
|
5991
|
+
$val = \$buff if $raf->Seek($pos,0) and $raf->Read($buff,$len)==$len;
|
5992
|
+
} else {
|
5993
|
+
$val = "(Binary data $len bytes)";
|
5994
|
+
}
|
5995
|
+
if ($val) {
|
5996
|
+
$self->FoundTag('EmbeddedVideo', $val);
|
5997
|
+
} else {
|
5998
|
+
$self->Warn('Error reading trailer');
|
5999
|
+
}
|
6000
|
+
} else {
|
6001
|
+
$self->Warn('Error seeking to end of file');
|
6002
|
+
}
|
6003
|
+
} elsif ($buff =~ /\xff\xd8\xff./g or
|
6004
|
+
($$self{Make} =~ /(Minolta|Sony)/i and $buff =~ /.\xd8\xff\xdb/g))
|
6005
|
+
{
|
6006
|
+
# adjust PreviewImageStart to this location
|
6007
|
+
my $actual = $pos + pos($buff) - 4;
|
6008
|
+
if ($start and $start ne $actual and $verbose > 1) {
|
6009
|
+
print $out "(Fixed PreviewImage location: $start -> $actual)\n";
|
6010
|
+
}
|
6011
|
+
# update preview image offsets
|
6012
|
+
if ($start) {
|
6013
|
+
$$self{VALUE}{PreviewImageStart} = $actual if $$self{VALUE}{PreviewImageStart};
|
6014
|
+
$$self{PreviewImageStart} = $actual;
|
6015
|
+
}
|
6016
|
+
# load preview now if we tried and failed earlier
|
6017
|
+
if ($$self{PreviewError} and $$self{PreviewImageLength}) {
|
6018
|
+
if ($raf->Seek($actual, 0) and $raf->Read($buff, $$self{PreviewImageLength})) {
|
6019
|
+
$self->FoundTag('PreviewImage', $buff);
|
6020
|
+
delete $$self{PreviewError};
|
6021
|
+
}
|
6000
6022
|
}
|
6001
6023
|
}
|
6002
6024
|
}
|
@@ -6047,7 +6069,7 @@ sub ProcessJPEG($$)
|
|
6047
6069
|
# only if we can't finish without scanning from end of file)
|
6048
6070
|
$self->ProcessTrailers($trailInfo) and undef $trailInfo;
|
6049
6071
|
}
|
6050
|
-
if ($wantTrailer) {
|
6072
|
+
if ($wantTrailer and $$self{PreviewImageStart}) {
|
6051
6073
|
# seek ahead and validate preview image
|
6052
6074
|
my $buff;
|
6053
6075
|
my $curPos = $raf->Tell();
|
@@ -6064,6 +6086,8 @@ sub ProcessJPEG($$)
|
|
6064
6086
|
require Image::ExifTool::Panasonic;
|
6065
6087
|
Image::ExifTool::Panasonic::ProcessLeicaTrailer($self);
|
6066
6088
|
$wantTrailer = 1 if $$self{LeicaTrailer};
|
6089
|
+
} else {
|
6090
|
+
$wantTrailer = 1 if $$options{ExtractEmbedded};
|
6067
6091
|
}
|
6068
6092
|
next if $trailInfo or $wantTrailer or $verbose > 2 or $htmlDump;
|
6069
6093
|
}
|
data/bin/lib/Image/ExifTool.pod
CHANGED
@@ -537,7 +537,7 @@ When set to 2, spaces to indent XMP for readability are also dropped. A
|
|
537
537
|
setting of 3 places all tags in a single rdf:Description element, and 4
|
538
538
|
removes newlines from between XMP elements. A setting of 5 also writes XMP
|
539
539
|
in shorthand format (to save setting the XMPShorthand option separately).
|
540
|
-
Default is
|
540
|
+
Default is 0.
|
541
541
|
|
542
542
|
=item Composite
|
543
543
|
|
@@ -1001,7 +1001,8 @@ look like rational numbers or dates. Default is 1.
|
|
1001
1001
|
|
1002
1002
|
=item XMPShorthand
|
1003
1003
|
|
1004
|
-
|
1004
|
+
Set to 1 to write xmp in shorthand format, or 2 to also combine properties
|
1005
|
+
into a single rdf:Description element. Default is 0.
|
1005
1006
|
|
1006
1007
|
=back
|
1007
1008
|
|
@@ -256,11 +256,11 @@ tags remain.
|
|
256
256
|
|
257
257
|
The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and
|
258
258
|
other tags which are not part of the EXIF specification, but may co-exist
|
259
|
-
with EXIF tags in some images. Tags which are part of the EXIF 2.
|
259
|
+
with EXIF tags in some images. Tags which are part of the EXIF 2.32
|
260
260
|
specification have an underlined B<Tag Name> in the HTML version of this
|
261
261
|
documentation. See
|
262
|
-
L<http://www.cipa.jp/std/documents/e/DC-008-Translation-
|
263
|
-
official EXIF 2.
|
262
|
+
L<http://www.cipa.jp/std/documents/e/DC-008-Translation-2019-E.pdf> for the
|
263
|
+
official EXIF 2.32 specification.
|
264
264
|
},
|
265
265
|
GPS => q{
|
266
266
|
These GPS tags are part of the EXIF standard, and are stored in a separate
|
@@ -55,7 +55,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
55
55
|
use Image::ExifTool qw(:DataAccess :Utils);
|
56
56
|
use Image::ExifTool::MakerNotes;
|
57
57
|
|
58
|
-
$VERSION = '4.
|
58
|
+
$VERSION = '4.17';
|
59
59
|
|
60
60
|
sub ProcessExif($$$);
|
61
61
|
sub WriteExif($$$);
|
@@ -1975,7 +1975,8 @@ my %sampleFormat = (
|
|
1975
1975
|
Writable => 'undef',
|
1976
1976
|
Mandatory => 1,
|
1977
1977
|
RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators)
|
1978
|
-
|
1978
|
+
# (allow strings like "2.31" when writing)
|
1979
|
+
PrintConvInv => '$val=~tr/.//d; $val=~/^\d{4}$/ ? $val : $val =~ /^\d{3}$/ ? "0$val" : undef',
|
1979
1980
|
},
|
1980
1981
|
0x9003 => {
|
1981
1982
|
Name => 'DateTimeOriginal',
|
@@ -2699,6 +2700,74 @@ my %sampleFormat = (
|
|
2699
2700
|
0xa433 => { Name => 'LensMake', Writable => 'string' }, #24
|
2700
2701
|
0xa434 => { Name => 'LensModel', Writable => 'string' }, #24
|
2701
2702
|
0xa435 => { Name => 'LensSerialNumber', Writable => 'string' }, #24
|
2703
|
+
0xa460 => { #Exif2.32
|
2704
|
+
Name => 'CompositeImage',
|
2705
|
+
Writable => 'int16u',
|
2706
|
+
PrintConv => {
|
2707
|
+
1 => 'No',
|
2708
|
+
2 => 'General Composite Image',
|
2709
|
+
3 => 'Composite Image Captured While Shooting',
|
2710
|
+
},
|
2711
|
+
},
|
2712
|
+
0xa461 => { #Exif2.32
|
2713
|
+
Name => 'CompositeImageCount',
|
2714
|
+
Notes => q{
|
2715
|
+
2 values: number of source images and the number of images used. Called
|
2716
|
+
SourceImageNumberOfCompositeImage by the EXIF spec.
|
2717
|
+
},
|
2718
|
+
Writable => 'int16u',
|
2719
|
+
Count => 2,
|
2720
|
+
},
|
2721
|
+
0xa462 => { #Exif2.32
|
2722
|
+
Name => 'CompositeImageExposureTimes',
|
2723
|
+
Notes => q{
|
2724
|
+
9 or more values: 1. total exposure time period, 2. total exposure of all
|
2725
|
+
source images, 3. total exposure of all used images, 4. Max exposure time of
|
2726
|
+
source images, 5. Max exposure time of used images, 6. Min exposure time of
|
2727
|
+
source images, 7. Min exposure of used images, 8. Number of sequences, 9.
|
2728
|
+
Number of source images in sequence. 10-N. Exposure times of each source
|
2729
|
+
image. Called SourceExposureTimesOfCompositeImage by the EXIF spec.
|
2730
|
+
},
|
2731
|
+
Writable => 'undef',
|
2732
|
+
RawConv => sub {
|
2733
|
+
my $val = shift;
|
2734
|
+
my @v;
|
2735
|
+
my $i = 0;
|
2736
|
+
for (;;) {
|
2737
|
+
if ($i == 56 or $i == 58) {
|
2738
|
+
last if $i + 2 > length $val;
|
2739
|
+
push @v, Get16u(\$val, $i);
|
2740
|
+
$i += 2;
|
2741
|
+
} else {
|
2742
|
+
last if $i + 8 > length $val;
|
2743
|
+
push @v, Image::ExifTool::GetRational64u(\$val, $i);
|
2744
|
+
$i += 8;
|
2745
|
+
}
|
2746
|
+
}
|
2747
|
+
return join ' ', @v;
|
2748
|
+
},
|
2749
|
+
RawConvInv => sub {
|
2750
|
+
my $val = shift;
|
2751
|
+
my @v = split ' ', $val;
|
2752
|
+
my $i;
|
2753
|
+
for ($i=0; ; ++$i) {
|
2754
|
+
last unless defined $v[$i];
|
2755
|
+
$v[$i] = ($i == 7 or $i == 8) ? Set16u($v[$i]) : Image::ExifTool::SetRational64u($v[$i]);
|
2756
|
+
}
|
2757
|
+
return join '', @v;
|
2758
|
+
},
|
2759
|
+
PrintConv => sub {
|
2760
|
+
my $val = shift;
|
2761
|
+
my @v = split ' ', $val;
|
2762
|
+
my $i;
|
2763
|
+
for ($i=0; ; ++$i) {
|
2764
|
+
last unless defined $v[$i];
|
2765
|
+
$v[$i] = PrintExposureTime($v[$i]) unless $i == 7 or $i == 8;
|
2766
|
+
}
|
2767
|
+
return join ' ', @v;
|
2768
|
+
},
|
2769
|
+
PrintConvInv => '$val',
|
2770
|
+
},
|
2702
2771
|
0xa480 => { Name => 'GDALMetadata', Writable => 'string', WriteGroup => 'IFD0' }, #3
|
2703
2772
|
0xa481 => { Name => 'GDALNoData', Writable => 'string', WriteGroup => 'IFD0' }, #3
|
2704
2773
|
0xa500 => { Name => 'Gamma', Writable => 'rational64u' },
|
@@ -30,7 +30,7 @@ use vars qw($VERSION);
|
|
30
30
|
use Image::ExifTool qw(:DataAccess :Utils);
|
31
31
|
use Image::ExifTool::Exif;
|
32
32
|
|
33
|
-
$VERSION = '1.
|
33
|
+
$VERSION = '1.72';
|
34
34
|
|
35
35
|
sub ProcessFujiDir($$$);
|
36
36
|
sub ProcessFaceRec($$$);
|
@@ -53,8 +53,10 @@ my %testedRAF = (
|
|
53
53
|
'0212' => 'S3Pro Ver2.12',
|
54
54
|
'0216' => 'S3Pro Ver2.16', # (NC)
|
55
55
|
'0218' => 'S3Pro Ver2.18',
|
56
|
+
'0240' => 'X-E1 Ver2.40',
|
56
57
|
'0264' => 'F700 Ver2.00',
|
57
58
|
'0266' => 'S9500 Ver1.01',
|
59
|
+
'0261' => 'X-E1 Ver2.61',
|
58
60
|
'0269' => 'S9500 Ver1.02',
|
59
61
|
'0271' => 'S3Pro Ver2.71', # UV/IR model?
|
60
62
|
'0300' => 'X-E2',
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::QuickTime;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.03';
|
20
20
|
|
21
21
|
sub ProcessGoPro($$$);
|
22
22
|
sub ProcessString($$$);
|
@@ -78,7 +78,7 @@ my %addUnits = (
|
|
78
78
|
Binary => 1,
|
79
79
|
},
|
80
80
|
ALLD => 'AutoLowLightDuration', #1 (gpmd) (untested)
|
81
|
-
# APTO (GPMF) - seen: 'RAW' (fmt c)
|
81
|
+
# APTO (GPMF) - seen: 'RAW', 'DYNM' (fmt c)
|
82
82
|
ATTD => { #PH (Karma)
|
83
83
|
Name => 'Attitude',
|
84
84
|
# UNIT=s,rad,rad,rad,rad/s,rad/s,rad/s,
|
@@ -94,7 +94,7 @@ my %addUnits = (
|
|
94
94
|
Binary => 1,
|
95
95
|
},
|
96
96
|
AUDO => 'AudioSetting', #PH (GPMF - seen: 'WIND', fmt c)
|
97
|
-
# AUPT (GPMF) - seen: 'N' (fmt c)
|
97
|
+
# AUPT (GPMF) - seen: 'N','Y' (fmt c)
|
98
98
|
BPOS => { #PH (Karma)
|
99
99
|
Name => 'Controller',
|
100
100
|
Unknown => 1,
|
@@ -104,9 +104,9 @@ my %addUnits = (
|
|
104
104
|
%addUnits,
|
105
105
|
},
|
106
106
|
# BRID (GPMF) - seen: 0 (fmt B)
|
107
|
-
# BROD (GPMF) - seen: 'ASK' (fmt c)
|
107
|
+
# BROD (GPMF) - seen: 'ASK','' (fmt c)
|
108
108
|
CASN => 'CameraSerialNumber', #PH (GPMF - seen: 'C3221324545448', fmt c)
|
109
|
-
# CINF (GPMF) - seen: 0x67376be7709bc8876a8baf3940908618 (fmt B)
|
109
|
+
# CINF (GPMF) - seen: 0x67376be7709bc8876a8baf3940908618 (fmt B) (Camera INFormation?)
|
110
110
|
# CMOD (GPMF) - seen: 12,13,17 [13 time-laps video, 17 JPEG] (fmt B)
|
111
111
|
CYTS => { #PH (Karma)
|
112
112
|
Name => 'CoyoteStatus',
|
@@ -130,13 +130,15 @@ my %addUnits = (
|
|
130
130
|
DVID => { Name => 'DeviceID', Unknown => 1 }, #2 (gpmd)
|
131
131
|
# DVNM (GPMF) seen: 'Video Global Settings' (fmt c), 'Highlights' (fmt c)
|
132
132
|
# DVNM (gpmd) seen: 'Camera' (Hero5), 'Hero6 Black' (Hero6), 'GoPro Karma v1.0' (Karma)
|
133
|
-
DVNM => 'DeviceName', #PH
|
133
|
+
DVNM => 'DeviceName', #PH (n/c)
|
134
134
|
DZOM => { #PH (GPMF - seen: 'Y', fmt c)
|
135
135
|
Name => 'DigitalZoom',
|
136
136
|
PrintConv => { N => 'No', Y => 'Yes' },
|
137
137
|
},
|
138
138
|
# DZST (GPMF) - seen: 0 (fmt L) (something to do with digital zoom maybe?)
|
139
|
-
|
139
|
+
EISA => { #PH (GPMF) - seen: 'Y','N', 'HS EIS' (fmt c) [N was for a time-lapse video]
|
140
|
+
Name => 'ElectronicImageStabilization',
|
141
|
+
},
|
140
142
|
# EISE (GPMF) - seen: 'Y' (fmt c)
|
141
143
|
EMPT => { Name => 'Empty', Unknown => 1 }, #2 (gpmd)
|
142
144
|
ESCS => { #PH (Karma)
|
@@ -147,7 +149,7 @@ my %addUnits = (
|
|
147
149
|
Unknown => 1,
|
148
150
|
%addUnits,
|
149
151
|
},
|
150
|
-
# EXPT (GPMF) - seen: '' (fmt c)
|
152
|
+
# EXPT (GPMF) - seen: '', 'AUTO' (fmt c)
|
151
153
|
FACE => 'FaceDetected', #PH (gpmd)
|
152
154
|
FCNM => 'FaceNumbers', #PH (gpmd) (faces counted per frame, ref 1)
|
153
155
|
FMWR => 'FirmwareVersion', #PH (GPMF - seen: HD6.01.01.51.00, fmt c)
|
@@ -213,7 +215,7 @@ my %addUnits = (
|
|
213
215
|
RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data
|
214
216
|
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::KBAT' },
|
215
217
|
},
|
216
|
-
# LINF (GPMF) - seen: LAJ7061916601668 (fmt c)
|
218
|
+
# LINF (GPMF) - seen: LAJ7061916601668 (fmt c) (Lens INFormation?)
|
217
219
|
LNED => { #PH (Karma)
|
218
220
|
Name => 'LocalPositionNED',
|
219
221
|
# UNIT=s,m,m,m,m/s,m/s,m/s
|
@@ -241,7 +243,7 @@ my %addUnits = (
|
|
241
243
|
PHDR => 'HDRSetting', #PH (APP6 - seen: 0)
|
242
244
|
PIMN => 'AutoISOMin', #PH (GPMF - seen: 100, fmt L)
|
243
245
|
PIMX => 'AutoISOMax', #PH (GPMF - seen: 1600, fmt L)
|
244
|
-
# PRAW (APP6) - seen: 0
|
246
|
+
# PRAW (APP6) - seen: 0, 'N' (fmt c)
|
245
247
|
PRES => 'PhotoResolution', #PH (APP6 - seen: '12MP_W')
|
246
248
|
PRTN => { #PH (GPMF - seen: 'N', fmt c)
|
247
249
|
Name => 'ProTune',
|
@@ -348,7 +350,7 @@ my %addUnits = (
|
|
348
350
|
# UNIT=m/s,m/s,m,m/s,deg,%
|
349
351
|
# TYPE=ffffsS
|
350
352
|
},
|
351
|
-
# VLTE (GPMF) - seen: 'Y' (fmt c)
|
353
|
+
# VLTE (GPMF) - seen: 'Y','N' (fmt c)
|
352
354
|
WBAL => 'ColorTemperatures', #PH (gpmd)
|
353
355
|
WRGB => { #PH (gpmd)
|
354
356
|
Name => 'WhiteBalanceRGB',
|
@@ -239,6 +239,10 @@ sub ProcessJPEG_HDR($$$);
|
|
239
239
|
Name => 'PreviewImage',
|
240
240
|
Condition => '$$valPt =~ /^\xff\xd8\xff/',
|
241
241
|
Writable => 1, # (for docs only)
|
242
|
+
}, {
|
243
|
+
Name => 'EmbeddedVideo',
|
244
|
+
Notes => 'extracted only when ExtractEmbedded option is used',
|
245
|
+
Condition => '$$valPt =~ /^.{4}ftyp/s',
|
242
246
|
}],
|
243
247
|
);
|
244
248
|
|
@@ -60,7 +60,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
60
60
|
use Image::ExifTool::Exif;
|
61
61
|
use Image::ExifTool::GPS;
|
62
62
|
|
63
|
-
$VERSION = '3.
|
63
|
+
$VERSION = '3.66';
|
64
64
|
|
65
65
|
sub LensIDConv($$$);
|
66
66
|
sub ProcessNikonAVI($$$);
|
@@ -574,7 +574,6 @@ sub GetAFPointGrid($$;$);
|
|
574
574
|
'F7 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
|
575
575
|
'FE 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
|
576
576
|
'F7 53 5C 80 24 24 40 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
|
577
|
-
'E2 47 5C 80 24 24 DF 4E' => 'Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)', #30
|
578
577
|
# 'FE 54 5C 80 24 24 DF 0E' => 'Tamron SP AF 70-200mm f/2.8 Di VC USD (A009)',
|
579
578
|
'FE 54 5C 80 24 24 DF 0E' => 'Tamron SP 70-200mm f/2.8 Di VC USD (A009)', #NJ
|
580
579
|
'E2 47 5C 80 24 24 DF 4E' => 'Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)', #forum9549
|
@@ -1786,7 +1785,7 @@ my %binaryDataAttrs = (
|
|
1786
1785
|
9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
|
1787
1786
|
},
|
1788
1787
|
},
|
1789
|
-
0x0094 => { Name => '
|
1788
|
+
0x0094 => { Name => 'SaturationAdj', Writable => 'int16s' },
|
1790
1789
|
0x0095 => { Name => 'NoiseReduction', Writable => 'string' }, # ("Off" or "FPNR"=long exposure NR)
|
1791
1790
|
0x0096 => {
|
1792
1791
|
Name => 'NEFLinearizationTable', # same table as DNG LinearizationTable (ref JD)
|
@@ -29,7 +29,7 @@ use strict;
|
|
29
29
|
use vars qw($VERSION);
|
30
30
|
use Image::ExifTool qw(:DataAccess :Utils);
|
31
31
|
|
32
|
-
$VERSION = '1.
|
32
|
+
$VERSION = '1.52';
|
33
33
|
|
34
34
|
sub ConvertTimecode($);
|
35
35
|
sub ProcessSGLT($$$);
|
@@ -534,6 +534,32 @@ my %code2charset = (
|
|
534
534
|
ProcessProc => \&ProcessSLLT,
|
535
535
|
},
|
536
536
|
},
|
537
|
+
#
|
538
|
+
# tags found in an AlphaImagingTech AVI video - PH
|
539
|
+
#
|
540
|
+
LIST_INF0 => { # ('0' instead of 'O' -- odd)
|
541
|
+
Name => 'Info',
|
542
|
+
SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Info' },
|
543
|
+
},
|
544
|
+
gps0 => {
|
545
|
+
Name => 'GPSTrack',
|
546
|
+
SetGroups => 'RIFF', # (moves "QuickTime" tags to the "RIFF" group)
|
547
|
+
SubDirectory => {
|
548
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
549
|
+
# (don't use code ref here or get "Prototype mismatch" warning with some Perl versions)
|
550
|
+
ProcessProc => 'Image::ExifTool::QuickTime::Process_gps0',
|
551
|
+
},
|
552
|
+
},
|
553
|
+
gsen => {
|
554
|
+
Name => 'GSensor',
|
555
|
+
SetGroups => 'RIFF', # (moves "QuickTime" tags to the "RIFF" group)
|
556
|
+
SubDirectory => {
|
557
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
558
|
+
ProcessProc => 'Image::ExifTool::QuickTime::Process_gsen',
|
559
|
+
},
|
560
|
+
},
|
561
|
+
# gpsa - seen hex "01 20 00 00", same as QuickTime
|
562
|
+
# gsea - 16 bytes hex "04 08 02 00 20 02 00 00 1f 03 00 00 01 00 00 00"
|
537
563
|
);
|
538
564
|
|
539
565
|
# the maker notes used by some digital cameras
|
@@ -1432,8 +1458,7 @@ sub MakeTagInfo($$)
|
|
1432
1458
|
|
1433
1459
|
#------------------------------------------------------------------------------
|
1434
1460
|
# Process RIFF chunks
|
1435
|
-
# Inputs: 0) ExifTool
|
1436
|
-
# 2) tag table reference
|
1461
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
1437
1462
|
# Returns: 1 on success
|
1438
1463
|
sub ProcessChunks($$$)
|
1439
1464
|
{
|
@@ -1661,9 +1686,14 @@ sub ProcessRIFF($$)
|
|
1661
1686
|
}
|
1662
1687
|
# RIFF chunks are padded to an even number of bytes
|
1663
1688
|
my $len2 = $len + ($len & 0x01);
|
1664
|
-
|
1689
|
+
my $tagInfo = $$tagTbl{$tag};
|
1690
|
+
if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF)$/)) {
|
1665
1691
|
$raf->Read($buff, $len2) == $len2 or $err=1, last;
|
1666
|
-
|
1692
|
+
my $setGroups;
|
1693
|
+
if ($tagInfo and ref $tagInfo eq 'HASH' and $$tagInfo{SetGroups}) {
|
1694
|
+
$setGroups = $$et{SET_GROUP0} = $$et{SET_GROUP1} = $$tagInfo{SetGroups};
|
1695
|
+
}
|
1696
|
+
MakeTagInfo($tagTbl, $tag) if not $tagInfo and ($verbose or $unknown);
|
1667
1697
|
$et->HandleTag($tagTbl, $tag, $buff,
|
1668
1698
|
DataPt => \$buff,
|
1669
1699
|
DataPos => 0, # (relative to Base)
|
@@ -1671,6 +1701,10 @@ sub ProcessRIFF($$)
|
|
1671
1701
|
Size => $len2,
|
1672
1702
|
Base => $pos,
|
1673
1703
|
);
|
1704
|
+
if ($setGroups) {
|
1705
|
+
delete $$et{SET_GROUP0};
|
1706
|
+
delete $$et{SET_GROUP1};
|
1707
|
+
}
|
1674
1708
|
} elsif ($tag eq 'RIFF') {
|
1675
1709
|
# don't read into RIFF chunk (eg. concatenated video file)
|
1676
1710
|
$raf->Read($buff, 4) == 4 or $err=1, last;
|
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
23
23
|
use Image::ExifTool::Exif;
|
24
24
|
|
25
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.45';
|
26
26
|
|
27
27
|
sub WriteSTMN($$$);
|
28
28
|
sub ProcessINFO($$$);
|
@@ -234,6 +234,7 @@ my %formatMinMax = (
|
|
234
234
|
0x500103c => 'WB600 / VLUU WB600 / WB610',
|
235
235
|
0x500133e => 'WB150 / WB150F / WB152 / WB152F / WB151',
|
236
236
|
0x5a0000f => 'WB5000 / HZ25W',
|
237
|
+
0x5a0001e => 'WB5500 / VLUU WB5500 / HZ50W',
|
237
238
|
0x6001036 => 'EX1',
|
238
239
|
0x700131c => 'VLUU SH100, SH100',
|
239
240
|
0x27127002 => 'SMX-C20N',
|
@@ -8599,7 +8599,7 @@ my %isoSetting2010 = (
|
|
8599
8599
|
);
|
8600
8600
|
|
8601
8601
|
|
8602
|
-
# AFInfo (SLT models only) (ref PH, decoded mainly from A77)
|
8602
|
+
# AFInfo 0x940e (SLT models only) (ref PH, decoded mainly from A77)
|
8603
8603
|
%Image::ExifTool::Sony::AFInfo = (
|
8604
8604
|
PROCESS_PROC => \&ProcessEnciphered,
|
8605
8605
|
WRITE_PROC => \&WriteEnciphered,
|
@@ -10171,7 +10171,7 @@ sub Decrypt($$$$)
|
|
10171
10171
|
}
|
10172
10172
|
|
10173
10173
|
#------------------------------------------------------------------------------
|
10174
|
-
# Decipher/encipher Sony tag
|
10174
|
+
# Decipher/encipher Sony tag 0x2010, 0x900b, 0x9050 and 0x940x data (ref PH)
|
10175
10175
|
# Inputs: 0) data reference, 1) true to encipher the data
|
10176
10176
|
sub Decipher($;$)
|
10177
10177
|
{
|
@@ -1547,6 +1547,9 @@ my %tagLookup = (
|
|
1547
1547
|
'componentversion' => { 92 => 0x80c },
|
1548
1548
|
'composer' => { 354 => ["\xa9com","\xa9wrt"], 362 => ["\xa9com","\xa9wrt"], 480 => 'composer' },
|
1549
1549
|
'composerkeywords' => { 362 => "\xa9cok" },
|
1550
|
+
'compositeimage' => { 114 => 0xa460 },
|
1551
|
+
'compositeimagecount' => { 114 => 0xa461 },
|
1552
|
+
'compositeimageexposuretimes' => { 114 => 0xa462 },
|
1550
1553
|
'composition' => { 445 => 'Composition' },
|
1551
1554
|
'compositionadjust' => { 336 => '0.1' },
|
1552
1555
|
'compositionadjustrotation' => { 336 => 0x7 },
|
@@ -4921,8 +4924,8 @@ my %tagLookup = (
|
|
4921
4924
|
'samsungmodelid' => { 376 => 0x3 },
|
4922
4925
|
'sanyoquality' => { 378 => 0x201 },
|
4923
4926
|
'sanyothumbnail' => { 378 => 0x100 },
|
4924
|
-
'saturation' => { 10 => 0x6e, 12 => 0x76, 34 => 0xe, 49 => 0x1, 107 => 0xd, 108 => [0x3013,0x1f], 114 => [0xa409,0xfe55], 122 => 0x1003, 148 => 'Saturation', 172 => 0x1f, 173 => 0x32, 174 => 0x28, 175 => 0x1a, 180 => 0x1, 215 =>
|
4925
|
-
'saturationadj' => { 98 => 0x20901, 103 => 0x116, 254 => 0x1, 258 => 0x2e, 433 => 0x8016 },
|
4927
|
+
'saturation' => { 10 => 0x6e, 12 => 0x76, 34 => 0xe, 49 => 0x1, 107 => 0xd, 108 => [0x3013,0x1f], 114 => [0xa409,0xfe55], 122 => 0x1003, 148 => 'Saturation', 172 => 0x1f, 173 => 0x32, 174 => 0x28, 175 => 0x1a, 180 => 0x1, 215 => 0xaa, 217 => 0x35, 218 => 0x3b, 219 => 0x43, 302 => 0x40, 304 => 0x300d, 337 => 0x1f, 344 => 0xd, 363 => 0x27, 365 => 0x58, 368 => 0x28, 369 => 0x1013, 379 => 0x10, 387 => 0x1e, 388 => 0x1b, 400 => 0x2005, 456 => 'Saturation', 460 => 'Saturation' },
|
4928
|
+
'saturationadj' => { 98 => 0x20901, 103 => 0x116, 215 => 0x94, 254 => 0x1, 258 => 0x2e, 433 => 0x8016 },
|
4926
4929
|
'saturationadjustmentaqua' => { 456 => 'SaturationAdjustmentAqua' },
|
4927
4930
|
'saturationadjustmentblue' => { 456 => 'SaturationAdjustmentBlue' },
|
4928
4931
|
'saturationadjustmentgreen' => { 456 => 'SaturationAdjustmentGreen' },
|
@@ -7352,6 +7355,7 @@ my %tagExists = (
|
|
7352
7355
|
'effectsvisible' => 1,
|
7353
7356
|
'eighteenpercentpoint' => 1,
|
7354
7357
|
'eighthlanguage' => 1,
|
7358
|
+
'electronicimagestabilization' => 1,
|
7355
7359
|
'electronicvr' => 1,
|
7356
7360
|
'elementarystreamtrack' => 1,
|
7357
7361
|
'embeddedaudiofile' => 1,
|
@@ -7368,6 +7372,7 @@ my %tagExists = (
|
|
7368
7372
|
'embeddedimagewidth' => 1,
|
7369
7373
|
'embeddedjpg' => 1,
|
7370
7374
|
'embeddedpng' => 1,
|
7375
|
+
'embeddedvideo' => 1,
|
7371
7376
|
'embeddedvideofile' => 1,
|
7372
7377
|
'embeddedvideotype' => 1,
|
7373
7378
|
'emphasis' => 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
|
15
|
+
They contain a total of 22577 tags, with 15020 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
|
@@ -144,6 +144,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
144
144
|
MIE MIE
|
145
145
|
Samsung Samsung Trailer
|
146
146
|
PreviewImage yes
|
147
|
+
EmbeddedVideo no
|
147
148
|
|
148
149
|
=head3 JPEG AVI1 Tags
|
149
150
|
|
@@ -308,11 +309,11 @@ tags remain.
|
|
308
309
|
|
309
310
|
The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and
|
310
311
|
other tags which are not part of the EXIF specification, but may co-exist
|
311
|
-
with EXIF tags in some images. Tags which are part of the EXIF 2.
|
312
|
+
with EXIF tags in some images. Tags which are part of the EXIF 2.32
|
312
313
|
specification have an underlined B<Tag Name> in the HTML version of this
|
313
314
|
documentation. See
|
314
|
-
L<http://www.cipa.jp/std/documents/e/DC-008-Translation-
|
315
|
-
official EXIF 2.
|
315
|
+
L<http://www.cipa.jp/std/documents/e/DC-008-Translation-2019-E.pdf> for the
|
316
|
+
official EXIF 2.32 specification.
|
316
317
|
|
317
318
|
Tag ID Tag Name Group Writable
|
318
319
|
------ -------- ----- --------
|
@@ -752,6 +753,9 @@ official EXIF 2.31 specification.
|
|
752
753
|
0xa433 LensMake ExifIFD string
|
753
754
|
0xa434 LensModel ExifIFD string
|
754
755
|
0xa435 LensSerialNumber ExifIFD string
|
756
|
+
0xa460 CompositeImage ExifIFD int16u
|
757
|
+
0xa461 CompositeImageCount ExifIFD int16u[2]
|
758
|
+
0xa462 CompositeImageExposureTimes ExifIFD undef
|
755
759
|
0xa480 GDALMetadata IFD0 string
|
756
760
|
0xa481 GDALNoData IFD0 string
|
757
761
|
0xa500 Gamma ExifIFD rational64u
|
@@ -10895,7 +10899,7 @@ DiMAGE X and Xt.
|
|
10895
10899
|
ShotInfoUnknown Nikon ShotInfo
|
10896
10900
|
0x0092 HueAdjustment int16s
|
10897
10901
|
0x0093 NEFCompression int16u
|
10898
|
-
0x0094
|
10902
|
+
0x0094 SaturationAdj int16s
|
10899
10903
|
0x0095 NoiseReduction string
|
10900
10904
|
0x0096 NEFLinearizationTable undef!
|
10901
10905
|
0x0097 ColorBalance0100 Nikon ColorBalance1
|
@@ -18834,6 +18838,7 @@ about this format.
|
|
18834
18838
|
'DVID' DeviceID? no
|
18835
18839
|
'DVNM' DeviceName no
|
18836
18840
|
'DZOM' DigitalZoom no
|
18841
|
+
'EISA' ElectronicImageStabilization no
|
18837
18842
|
'EMPT' Empty? no
|
18838
18843
|
'ESCS' EscapeStatus? no
|
18839
18844
|
'FACE' FaceDetected no
|
@@ -27795,6 +27800,7 @@ sub-documents, but the Duration is calculated for the full video.
|
|
27795
27800
|
PentaxJunk2 Pentax Junk2
|
27796
27801
|
TextJunk no
|
27797
27802
|
'JUNQ' OldXMP no
|
27803
|
+
'LIST_INF0' Info RIFF Info
|
27798
27804
|
'LIST_INFO' Info RIFF Info
|
27799
27805
|
'LIST_Tdat' Tdat RIFF Tdat
|
27800
27806
|
'LIST_exif' Exif RIFF Exif
|
@@ -27815,6 +27821,8 @@ sub-documents, but the Duration is calculated for the full video.
|
|
27815
27821
|
'ds64' DataSize64 RIFF DS64
|
27816
27822
|
'fact' NumberOfSamples no
|
27817
27823
|
'fmt ' AudioFormat RIFF AudioFormat
|
27824
|
+
'gps0' GPSTrack QuickTime Stream
|
27825
|
+
'gsen' GSensor QuickTime Stream
|
27818
27826
|
'labl' Label RIFF Label
|
27819
27827
|
'list' ListType no
|
27820
27828
|
'olym' Olym Olympus WAV
|
@@ -32953,6 +32961,7 @@ FileName.
|
|
32953
32961
|
CurrentIPTCDigest File no
|
32954
32962
|
Directory System yes!
|
32955
32963
|
EXIF EXIF yes!
|
32964
|
+
EmbeddedVideo File no
|
32956
32965
|
Error ExifTool no
|
32957
32966
|
ExifByteOrder File yes
|
32958
32967
|
ExifToolVersion ExifTool no
|
@@ -14,7 +14,7 @@ use strict;
|
|
14
14
|
use vars qw($VERSION);
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.04';
|
18
18
|
|
19
19
|
sub ReadBencode($$);
|
20
20
|
sub ExtractTags($$$;$$@);
|
@@ -232,6 +232,11 @@ sub ExtractTags($$$;$$@)
|
|
232
232
|
$tagInfo = $et->GetTagInfo($tagTablePtr, $id) or next;
|
233
233
|
}
|
234
234
|
if (ref $val eq 'HASH') {
|
235
|
+
if ($et->Options('Struct') and $tagInfo and $$tagInfo{Name} eq 'Info') {
|
236
|
+
$et->FoundTag($tagInfo, $val);
|
237
|
+
++$count;
|
238
|
+
next;
|
239
|
+
}
|
235
240
|
# extract tags from this dictionary
|
236
241
|
my ($table, $rootID, $rootName);
|
237
242
|
if ($$tagInfo{SubDirectory}) {
|
@@ -268,7 +273,7 @@ sub ProcessTorrent($$)
|
|
268
273
|
my $dict = ReadBencode($raf, \$buff);
|
269
274
|
my $err = $$raf{BencodeError};
|
270
275
|
$et->Warn("Bencode error: $err") if $err;
|
271
|
-
if (ref $dict eq 'HASH' and $$dict{announce}) {
|
276
|
+
if (ref $dict eq 'HASH' and ($$dict{announce} or $$dict{'created by'})) {
|
272
277
|
$et->SetFileType();
|
273
278
|
my $tagTablePtr = GetTagTable('Image::ExifTool::Torrent::Main');
|
274
279
|
ExtractTags($et, $dict, $tagTablePtr) and $success = 1;
|
@@ -22,7 +22,7 @@ $VERSION = '1.14';
|
|
22
22
|
use Image::ExifTool qw(:Utils);
|
23
23
|
use Image::ExifTool::Exif;
|
24
24
|
|
25
|
-
# EXIF table tag ID's which are part of the EXIF 2.
|
25
|
+
# EXIF table tag ID's which are part of the EXIF 2.32 specification
|
26
26
|
# (also used by BuildTagLookup to add underlines in HTML version of EXIF Tag Table)
|
27
27
|
%exifSpec = (
|
28
28
|
0x1 => 1,
|
@@ -42,16 +42,16 @@ use Image::ExifTool::Exif;
|
|
42
42
|
0x11a => 1, 0x8834 => 1, 0x9403 => 1, 0xa40a => 1,
|
43
43
|
0x11b => 1, 0x8835 => 1, 0x9404 => 1, 0xa40b => 1,
|
44
44
|
0x11c => 1, 0x9000 => 1, 0x9405 => 1, 0xa40c => 1,
|
45
|
-
0x128 => 1, 0x9003 => 1, 0xa000 => 1,
|
46
|
-
0x12d => 1, 0x9004 => 1, 0xa001 => 1,
|
47
|
-
0x131 => 1, 0x9010 => 1, 0xa002 => 1,
|
48
|
-
0x132 => 1, 0x9011 => 1, 0xa003 => 1,
|
49
|
-
0x13b => 1, 0x9012 => 1, 0xa004 => 1,
|
50
|
-
0x13e => 1, 0x9101 => 1, 0xa005 => 1,
|
51
|
-
0x13f => 1, 0x9102 => 1, 0xa20b => 1,
|
52
|
-
0x201 => 1, 0x9201 => 1, 0xa20c => 1,
|
53
|
-
0x202 => 1, 0x9202 => 1, 0xa20e => 1,
|
54
|
-
0x211 => 1, 0x9203 => 1, 0xa20f => 1,
|
45
|
+
0x128 => 1, 0x9003 => 1, 0xa000 => 1, 0xa460 => 1,
|
46
|
+
0x12d => 1, 0x9004 => 1, 0xa001 => 1, 0xa461 => 1,
|
47
|
+
0x131 => 1, 0x9010 => 1, 0xa002 => 1, 0xa462 => 1,
|
48
|
+
0x132 => 1, 0x9011 => 1, 0xa003 => 1, 0xa420 => 1,
|
49
|
+
0x13b => 1, 0x9012 => 1, 0xa004 => 1, 0xa430 => 1,
|
50
|
+
0x13e => 1, 0x9101 => 1, 0xa005 => 1, 0xa431 => 1,
|
51
|
+
0x13f => 1, 0x9102 => 1, 0xa20b => 1, 0xa432 => 1,
|
52
|
+
0x201 => 1, 0x9201 => 1, 0xa20c => 1, 0xa433 => 1,
|
53
|
+
0x202 => 1, 0x9202 => 1, 0xa20e => 1, 0xa434 => 1,
|
54
|
+
0x211 => 1, 0x9203 => 1, 0xa20f => 1, 0xa435 => 1,
|
55
55
|
0x212 => 1, 0x9204 => 1, 0xa210 => 1,
|
56
56
|
0x213 => 1, 0x9205 => 1, 0xa214 => 1,
|
57
57
|
0x214 => 1, 0x9206 => 1, 0xa215 => 1,
|
@@ -38,7 +38,7 @@ my %mandatory = (
|
|
38
38
|
0x0128 => 2, # ResolutionUnit (inches)
|
39
39
|
},
|
40
40
|
ExifIFD => {
|
41
|
-
0x9000 => '
|
41
|
+
0x9000 => '0232', # ExifVersion
|
42
42
|
0x9101 => "1 2 3 0",# ComponentsConfiguration
|
43
43
|
0xa000 => '0100', # FlashpixVersion
|
44
44
|
0xa001 => 0xffff, # ColorSpace (uncalibrated)
|
@@ -793,11 +793,18 @@ sub WriteQuickTime($$$)
|
|
793
793
|
}
|
794
794
|
$size = $hi * 4294967296 + $lo - 16;
|
795
795
|
$size < 0 and $et->Error('Invalid extended atom size'), last;
|
796
|
-
} elsif ($size == -8
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
796
|
+
} elsif ($size == -8) {
|
797
|
+
if ($dataPt) {
|
798
|
+
my $pos = $raf->Tell() - 4;
|
799
|
+
$raf->Seek(0,2);
|
800
|
+
my $str = $$dirInfo{DirName} . ' with ' . ($raf->Tell() - $pos) . ' bytes';
|
801
|
+
$et->Error("Terminator found in $str remaining", 1);
|
802
|
+
} else {
|
803
|
+
# size of zero is only valid for top-level atom, and
|
804
|
+
# indicates the atom extends to the end of file
|
805
|
+
# (save in mdat list to write later; with zero end position to copy rest of file)
|
806
|
+
push @mdat, [ $raf->Tell(), 0, $hdr ];
|
807
|
+
}
|
801
808
|
last;
|
802
809
|
} elsif ($size < 0) {
|
803
810
|
if ($$tagTablePtr{VARS}{IGNORE_BAD_ATOMS} and $dataPt) {
|
@@ -1029,7 +1036,7 @@ sub WriteQuickTime($$$)
|
|
1029
1036
|
my $prVal = $newVal;
|
1030
1037
|
my $flags = FormatQTValue($et, \$newVal, $$tagInfo{Format});
|
1031
1038
|
next unless defined $newVal;
|
1032
|
-
my ($ctry, $lang) = (0,
|
1039
|
+
my ($ctry, $lang) = (0, $undLang);
|
1033
1040
|
if ($$ti{LangCode}) {
|
1034
1041
|
unless ($$ti{LangCode} =~ /^([A-Z]{3})?[-_]?([A-Z]{2})?$/i) {
|
1035
1042
|
$et->Warn("Invalid language code for $$ti{Name}");
|
@@ -1179,6 +1186,11 @@ sub WriteQuickTime($$$)
|
|
1179
1186
|
} else {
|
1180
1187
|
$newData = pack('nn', length($newData), $lang) . $newData;
|
1181
1188
|
}
|
1189
|
+
} elsif (not $$tagInfo{Format} or $$tagInfo{Format} =~ /^string/ and
|
1190
|
+
not $$tagInfo{Binary} and not $$tagInfo{ValueConv})
|
1191
|
+
{
|
1192
|
+
# write all strings as UTF-8
|
1193
|
+
$newData = $et->Encode($newData, 'UTF8');
|
1182
1194
|
}
|
1183
1195
|
}
|
1184
1196
|
$$didTag{$nvHash} = 1; # set flag so we don't add this tag again
|
@@ -1315,8 +1327,10 @@ sub WriteQuickTime($$$)
|
|
1315
1327
|
}
|
1316
1328
|
if ($$dirInfo{HasData}) {
|
1317
1329
|
# add 'data' header
|
1330
|
+
$lang or $lang = $undLang;
|
1318
1331
|
$newVal = pack('Na4Nnn',16+length($newVal),'data',$flags,$ctry,$lang).$newVal;
|
1319
1332
|
} elsif ($tag =~ /^\xa9/ or $$tagInfo{IText}) {
|
1333
|
+
$lang or $lang = $undLang;
|
1320
1334
|
if ($ctry) {
|
1321
1335
|
my $grp = $et->GetGroup($tagInfo,1);
|
1322
1336
|
$et->Warn("Can't use country code for $grp:$$tagInfo{Name}");
|
@@ -607,7 +607,7 @@ sub LimitXMPSize($$$$$$)
|
|
607
607
|
my ($sp, $nl) = $noPad ? ('', $noPad > 1 ? '' : "\n") : (' ',"\n");
|
608
608
|
# write the required xmpNote:HasExtendedXMP property
|
609
609
|
$newData .= "$nl$sp<$rdfDesc rdf:about='${about}'\n$sp${sp}xmlns:xmpNote='$nsURI{xmpNote}'";
|
610
|
-
if ($$et{OPTIONS}{XMPShorthand} or
|
610
|
+
if ($$et{OPTIONS}{XMPShorthand} or $$et{OPTIONS}{Compact} > 4) {
|
611
611
|
$newData .= "\n$sp${sp}xmpNote:HasExtendedXMP='${guid}'/>\n";
|
612
612
|
} else {
|
613
613
|
$newData .= ">$nl$sp$sp<xmpNote:HasExtendedXMP>$guid</xmpNote:HasExtendedXMP>$nl$sp</$rdfDesc>\n";
|
@@ -723,7 +723,7 @@ sub WriteXMP($$;$)
|
|
723
723
|
# prefer XMP over other metadata formats in some types of files
|
724
724
|
my $preferred = $xmpFile || ($$et{PreferredGroup} and $$et{PreferredGroup} eq 'XMP');
|
725
725
|
my $verbose = $$et{OPTIONS}{Verbose};
|
726
|
-
my $compact = $$et{OPTIONS}{Compact}
|
726
|
+
my $compact = $$et{OPTIONS}{Compact};
|
727
727
|
my $dirLen = $$dirInfo{DirLen};
|
728
728
|
$dirLen = length($$dataPt) if not defined $dirLen and $dataPt;
|
729
729
|
$noPad = $compact > 1 ? ($compact > 3 ? 2 : 1) : undef;
|
@@ -1236,7 +1236,7 @@ sub WriteXMP($$;$)
|
|
1236
1236
|
# write out the new XMP information (serialize it)
|
1237
1237
|
#
|
1238
1238
|
# start writing the XMP data
|
1239
|
-
my $useShorthand = $$et{OPTIONS}{XMPShorthand} || $compact > 4;
|
1239
|
+
my $useShorthand = $$et{OPTIONS}{XMPShorthand} || ($compact > 4 ? 1 : 0);
|
1240
1240
|
my (@long, @short, @resFlag);
|
1241
1241
|
$long[0] = $long[1] = $short[0] = '';
|
1242
1242
|
if ($$et{XMP_NO_XPACKET}) {
|
@@ -1316,7 +1316,7 @@ sub WriteXMP($$;$)
|
|
1316
1316
|
my ($path2, $ns2);
|
1317
1317
|
foreach $path2 (@pathList) {
|
1318
1318
|
my @ns2s = ($path2 =~ m{(?:^|/)([^/]+?):}g);
|
1319
|
-
my $opening = $compact > 2 ? 1 : 0;
|
1319
|
+
my $opening = ($compact > 2 or $useShorthand > 1) ? 1 : 0;
|
1320
1320
|
foreach $ns2 (@ns2s) {
|
1321
1321
|
next if $ns2 eq 'rdf';
|
1322
1322
|
$nsNew{$ns2} and ++$opening, next;
|
@@ -19,7 +19,7 @@ use strict;
|
|
19
19
|
use vars qw($VERSION $warnString);
|
20
20
|
use Image::ExifTool qw(:DataAccess :Utils);
|
21
21
|
|
22
|
-
$VERSION = '1.
|
22
|
+
$VERSION = '1.25';
|
23
23
|
|
24
24
|
sub WarnProc($) { $warnString = $_[0]; }
|
25
25
|
|
@@ -308,6 +308,9 @@ sub ProcessRAR($$)
|
|
308
308
|
$raf->Seek($size, 1) or last if $size;
|
309
309
|
}
|
310
310
|
$$et{DOC_NUM} = 0;
|
311
|
+
if ($docNum > 1 and not $et->Options('Duplicates')) {
|
312
|
+
$et->Warn("Use the Duplicates option to extract tags for all $docNum files", 1);
|
313
|
+
}
|
311
314
|
|
312
315
|
return 1;
|
313
316
|
}
|
@@ -387,11 +390,12 @@ sub ProcessZIP($$)
|
|
387
390
|
{
|
388
391
|
my ($et, $dirInfo) = @_;
|
389
392
|
my $raf = $$dirInfo{RAF};
|
390
|
-
my ($buff, $buf2, $zip
|
393
|
+
my ($buff, $buf2, $zip);
|
391
394
|
|
392
395
|
return 0 unless $raf->Read($buff, 30) == 30 and $buff =~ /^PK\x03\x04/;
|
393
396
|
|
394
397
|
my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::Main');
|
398
|
+
my $docNum = 0;
|
395
399
|
|
396
400
|
# use Archive::Zip if avilable
|
397
401
|
for (;;) {
|
@@ -566,7 +570,6 @@ sub ProcessZIP($$)
|
|
566
570
|
# otherwise just extract general ZIP information
|
567
571
|
$et->SetFileType();
|
568
572
|
@members = $zip->members();
|
569
|
-
$docNum = 0;
|
570
573
|
my ($member, $iWorkType);
|
571
574
|
# special files to extract
|
572
575
|
my %extract = (
|
@@ -608,12 +611,14 @@ sub ProcessZIP($$)
|
|
608
611
|
if ($zip) {
|
609
612
|
delete $$dirInfo{ZIP};
|
610
613
|
delete $$et{DOC_NUM};
|
614
|
+
if ($docNum > 1 and not $et->Options('Duplicates')) {
|
615
|
+
$et->Warn("Use the Duplicates option to extract tags for all $docNum files", 1);
|
616
|
+
}
|
611
617
|
return 1;
|
612
618
|
}
|
613
619
|
#
|
614
620
|
# process the ZIP file by hand (funny, but this seems easier than using Archive::Zip)
|
615
621
|
#
|
616
|
-
$docNum = 0;
|
617
622
|
$et->VPrint(1, " -- processing as binary data --\n");
|
618
623
|
$raf->Seek(30, 0);
|
619
624
|
$et->SetFileType();
|
@@ -659,6 +664,9 @@ sub ProcessZIP($$)
|
|
659
664
|
$raf->Read($buff, 30) == 30 and $buff =~ /^PK\x03\x04/ or last;
|
660
665
|
}
|
661
666
|
delete $$et{DOC_NUM};
|
667
|
+
if ($docNum > 1 and not $et->Options('Duplicates')) {
|
668
|
+
$et->Warn("Use the Duplicates option to extract tags for all $docNum files", 1);
|
669
|
+
}
|
662
670
|
return 1;
|
663
671
|
}
|
664
672
|
|
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: 11.
|
4
|
+
version: 11.53.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: 2019-06-
|
12
|
+
date: 2019-06-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|