summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorexiftool <exiftool@users.sourceforge.net>2021-08-12 09:10:18 -0400
committerexiftool <exiftool@users.sourceforge.net>2021-08-12 09:10:18 -0400
commit57f44297961839f40e70d682865c41828b7f71b5 (patch)
tree43355d59d13fa9a0500dca29ca9e247b05ec7131 /lib
parentb0d89144691bc0b8fdde1bad33518126277489f9 (diff)
Update to 12.30
Diffstat (limited to 'lib')
-rw-r--r--lib/Image/ExifTool.pm59
-rw-r--r--lib/Image/ExifTool.pod5
-rw-r--r--lib/Image/ExifTool/BuildTagLookup.pm11
-rw-r--r--lib/Image/ExifTool/Canon.pm5
-rw-r--r--lib/Image/ExifTool/Exif.pm4
-rw-r--r--lib/Image/ExifTool/FujiFilm.pm1
-rw-r--r--lib/Image/ExifTool/ID3.pm18
-rw-r--r--lib/Image/ExifTool/Lang/nl.pm119
-rw-r--r--lib/Image/ExifTool/M2TS.pm64
-rw-r--r--lib/Image/ExifTool/Nikon.pm11
-rw-r--r--lib/Image/ExifTool/NikonSettings.pm12
-rw-r--r--lib/Image/ExifTool/Olympus.pm3
-rw-r--r--lib/Image/ExifTool/Other.pm93
-rw-r--r--lib/Image/ExifTool/QuickTime.pm13
-rw-r--r--lib/Image/ExifTool/QuickTimeStream.pl7
-rw-r--r--lib/Image/ExifTool/RIFF.pm7
-rw-r--r--lib/Image/ExifTool/Samsung.pm57
-rw-r--r--lib/Image/ExifTool/Sony.pm43
-rw-r--r--lib/Image/ExifTool/TagLookup.pm8
-rw-r--r--lib/Image/ExifTool/TagNames.pod35
-rw-r--r--lib/Image/ExifTool/WriteQuickTime.pl8
-rw-r--r--lib/Image/ExifTool/Writer.pl3
-rw-r--r--lib/Image/ExifTool/XMP.pm7
-rw-r--r--lib/Image/ExifTool/XMP2.pl3
24 files changed, 452 insertions, 144 deletions
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm
index 96521672..1ac96013 100644
--- a/lib/Image/ExifTool.pm
+++ b/lib/Image/ExifTool.pm
@@ -26,9 +26,10 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
$psAPP13hdr $psAPP13old @loadAllTables %UserDefined $evalWarning
%noWriteFile %magicNumber @langs $defaultLang %langName %charsetName
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
- %jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
+ %jpegMarker %specialTags %fileTypeLookup $testLen $exePath
+ %static_vars);
-$VERSION = '12.29';
+$VERSION = '12.30';
$RELEASE = '';
@ISA = qw(Exporter);
%EXPORT_TAGS = (
@@ -139,17 +140,17 @@ sub ReadValue($$$;$$$);
PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw Lytro MinoltaRaw PanasonicRaw
SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BMP::Extra BPG BPG::Extensions
PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC LIF MRC::FEI12 MIFF PCX PGF
- PSP PhotoCD Radiance PDF PostScript Photoshop::Header Photoshop::Layers
- Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD Samsung::Trailer Sony::SRF2
- Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3 FLAC Ogg Vorbis APE
- APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing
- M2TS QuickTime QuickTime::ImageFile QuickTime::Stream QuickTime::Tags360Fly
- Matroska MOI MXF DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile
- Red RIFF AIFF ASF WTV DICOM FITS MIE JSON HTML XMP::SVG Palm Palm::MOBI
- Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF
- EXE::ELF EXE::AR EXE::CHM LNK Font VCard Text VCard::VCalendar RSRC Rawzor
- ZIP ZIP::GZIP ZIP::RAR RTF OOXML iWork ISO FLIR::AFF FLIR::FPF MacOS
- MacOS::MDItem FlashPix::DocTable
+ PSP PhotoCD Radiance Other::PFM PDF PostScript Photoshop::Header
+ Photoshop::Layers Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD
+ Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3
+ FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio
+ MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile QuickTime::Stream
+ QuickTime::Tags360Fly Matroska MOI MXF DV Flash Flash::FLV Real::Media
+ Real::Audio Real::Metafile Red RIFF AIFF ASF WTV DICOM FITS MIE JSON HTML
+ XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString
+ EXE::MachO EXE::PEF EXE::ELF EXE::AR EXE::CHM LNK Font VCard Text
+ VCard::VCalendar RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR RTF OOXML iWork ISO
+ FLIR::AFF FLIR::FPF MacOS MacOS::MDItem FlashPix::DocTable
);
# alphabetical list of current Lang modules
@@ -190,7 +191,7 @@ $defaultLang = 'en'; # default language
HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2
CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS
MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA PDB
- MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD TXT);
+ PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD TXT);
# file types that we can write (edit)
my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
@@ -436,7 +437,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
PEF => ['TIFF', 'Pentax (RAW) Electronic Format'],
PFA => ['Font', 'PostScript Font ASCII'],
PFB => ['Font', 'PostScript Font Binary'],
- PFM => ['Font', 'Printer Font Metrics'],
+ PFM => [['Font','PFM2'], 'Printer Font Metrics'], # (description is overridden for Portable FloatMap images)
PGF => ['PGF', 'Progressive Graphics File'],
PGM => ['PPM', 'Portable Gray Map'],
PHP => ['PHP', 'PHP Hypertext Preprocessor'],
@@ -836,6 +837,7 @@ my %moduleName = (
ORF => 'Olympus',
PDB => 'Palm',
PCD => 'PhotoCD',
+ PFM2 => 'Other',
PHP => 0,
PMP => 'Sony',
PS => 'PostScript',
@@ -932,10 +934,11 @@ $testLen = 1024; # number of bytes to read when testing for magic number
MXF => '\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02', # (not tested if extension recognized)
OGG => '(OggS|ID3)',
ORF => '(II|MM)',
- PDB => '.{60}(\.pdfADBE|TEXtREAd|BVokBDIC|DB99DBOS|PNRdPPrs|DataPPrs|vIMGView|PmDBPmDB|InfoINDB|ToGoToGo|SDocSilX|JbDbJBas|JfDbJFil|DATALSdb|Mdb1Mdb1|BOOKMOBI|DataPlkr|DataSprd|SM01SMem|TEXtTlDc|InfoTlIf|DataTlMl|DataTlPt|dataTDBP|TdatTide|ToRaTRPW|zTXTGPlm|BDOCWrdS)',
# PCD => signature is at byte 2048
PCX => '\x0a[\0-\x05]\x01[\x01\x02\x04\x08].{64}[\0-\x02]',
+ PDB => '.{60}(\.pdfADBE|TEXtREAd|BVokBDIC|DB99DBOS|PNRdPPrs|DataPPrs|vIMGView|PmDBPmDB|InfoINDB|ToGoToGo|SDocSilX|JbDbJBas|JfDbJFil|DATALSdb|Mdb1Mdb1|BOOKMOBI|DataPlkr|DataSprd|SM01SMem|TEXtTlDc|InfoTlIf|DataTlMl|DataTlPt|dataTDBP|TdatTide|ToRaTRPW|zTXTGPlm|BDOCWrdS)',
PDF => '\s*%PDF-\d+\.\d+',
+ PFM => 'P[Ff]\x0a\d+ \d+\x0a[-+0-9.]+\x0a',
PGF => 'PGF',
PHP => '<\?php\s',
PICT => '(.{10}|.{522})(\x11\x01|\x00\x11)',
@@ -1937,6 +1940,8 @@ my %systemTagsNotes = (
return \$img;
},
},
+ # Apple may add "AMPF" to the end of the JFIF record,
+ # possibly indicating the existence of MPF images (ref forum12677)
);
# Composite tags (accumulation of all Composite tag tables)
@@ -3785,7 +3790,15 @@ sub GetFileType(;$$)
# return description if specified
# (allow input $file to be a FileType for this purpose)
if ($desc) {
- $desc = $fileType ? $$fileType[1] : $fileDescription{$file};
+ if ($fileType) {
+ if ($static_vars{OverrideFileDescription} and $static_vars{OverrideFileDescription}{$fileExt}) {
+ $desc = $static_vars{OverrideFileDescription}{$fileExt};
+ } else {
+ $desc = $$fileType[1];
+ }
+ } else {
+ $desc = $fileDescription{$file};
+ }
$desc .= ", $subType" if $subType;
return $desc;
} elsif ($fileType and (not defined $desc or $desc ne '0')) {
@@ -3850,6 +3863,7 @@ sub Init($)
foreach (keys %$self) {
/[a-z]/ and delete $$self{$_};
}
+ undef %static_vars; # clear all static variables
delete $$self{FOUND_TAGS}; # list of found tags
delete $$self{EXIF_DATA}; # the EXIF data block
delete $$self{EXIF_POS}; # EXIF position in file
@@ -6191,6 +6205,7 @@ sub ProcessJPEG($$)
my $marker = $nextMarker;
my $segDataPt = $nextSegDataPt;
my $segPos = $nextSegPos;
+ my $skipped;
undef $nextMarker;
undef $nextSegDataPt;
#
@@ -6200,11 +6215,13 @@ sub ProcessJPEG($$)
# read up to next marker (JPEG markers begin with 0xff)
my $buff;
$raf->ReadLine($buff) or last;
+ $skipped = length($buff) - 1;
# JPEG markers can be padded with unlimited 0xff's
for (;;) {
$raf->Read($ch, 1) or last Marker;
$nextMarker = ord($ch);
last unless $nextMarker == 0xff;
+ ++$skipped;
}
# read segment data if it exists
if (not defined $markerLenBytes{$nextMarker}) {
@@ -6231,6 +6248,14 @@ sub ProcessJPEG($$)
# set some useful variables for the current segment
my $markerName = JpegMarkerName($marker);
$$path[$pn] = $markerName;
+ # issue warning if we skipped some garbage
+ if ($skipped and not $foundSOS) {
+ $self->Warn("Skipped unknown $skipped bytes after JPEG $markerName segment", 1);
+ if ($htmlDump) {
+ $self->HDump($nextSegPos-4-$skipped, $skipped, "[unknown $skipped bytes]", undef, 0x08);
+ $dumpEnd = $nextSegPos - 4;
+ }
+ }
#
# parse the current segment
#
diff --git a/lib/Image/ExifTool.pod b/lib/Image/ExifTool.pod
index 9c08d3cd..6367d2ec 100644
--- a/lib/Image/ExifTool.pod
+++ b/lib/Image/ExifTool.pod
@@ -1188,8 +1188,9 @@ file from scratch. A reference to a
L<File::RandomAccess|File::RandomAccess> object is also allowed as a source,
but in this case the destination is not optional.
-2) [optional] Destination file name, file reference, scalar reference, or
-undef to overwrite the original file. May be '-' to write to stdout.
+2) [optional] Destination file name, file reference, scalar reference to
+write to memory, or undef to overwrite the original file. May be '-' to
+write to stdout.
3) [optional] Destination file type. Ignored if a source is defined.
diff --git a/lib/Image/ExifTool/BuildTagLookup.pm b/lib/Image/ExifTool/BuildTagLookup.pm
index 850f6aa2..1b2b249d 100644
--- a/lib/Image/ExifTool/BuildTagLookup.pm
+++ b/lib/Image/ExifTool/BuildTagLookup.pm
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
use Image::ExifTool::Validate;
use Image::ExifTool::MacOS;
-$VERSION = '3.44';
+$VERSION = '3.45';
@ISA = qw(Exporter);
sub NumbersFirst($$);
@@ -2117,7 +2117,7 @@ sub WriteTagNames($$)
$short = $$shortName{$tableName};
my @names = split ' ', $short;
my $class = shift @names;
- if (@names) {
+ if (@names and $class ne 'Other') {
# add heading for tables without a Main
unless ($heading eq $class) {
$heading = $class;
@@ -2145,6 +2145,13 @@ sub WriteTagNames($$)
$short = $$shortName{$tableName};
$short = $tableName unless $short;
$url = "$short.html";
+ # handle various tables in "Other.pm"
+ if ($short =~ /^Other (.*)/) {
+ $short = $1;
+ $url = 'Other.html#' . $1;
+ } else {
+ $url = "$short.html";
+ }
print HTMLFILE "<a href='${url}'>$short</a>";
++$count;
}
diff --git a/lib/Image/ExifTool/Canon.pm b/lib/Image/ExifTool/Canon.pm
index 4ddb7a8e..24c6a8d6 100644
--- a/lib/Image/ExifTool/Canon.pm
+++ b/lib/Image/ExifTool/Canon.pm
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
sub ProcessExifInfo($$$);
sub SwapWords($);
-$VERSION = '4.49';
+$VERSION = '4.50';
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -557,7 +557,8 @@ $VERSION = '4.49';
4158 => 'Canon EF-S 18-55mm f/4-5.6 IS STM', #PH
4159 => 'Canon EF-M 32mm f/1.4 STM', #42
4160 => 'Canon EF-S 35mm f/2.8 Macro IS STM', #42
- 4208 => 'Sigma 56mm f/1.4 DC DN | C', #forum10603
+ 4208 => 'Sigma 56mm f/1.4 DC DN | C or other Sigma Lens', #forum10603
+ 4208.1 => 'Sigma 30mm F1.4 DC DN | C', #git issue#83 (016)
# (Nano USM lenses - 0x90xx)
36910 => 'Canon EF 70-300mm f/4-5.6 IS II USM', #42
36912 => 'Canon EF-S 18-135mm f/3.5-5.6 IS USM', #42
diff --git a/lib/Image/ExifTool/Exif.pm b/lib/Image/ExifTool/Exif.pm
index f45e904a..60578b23 100644
--- a/lib/Image/ExifTool/Exif.pm
+++ b/lib/Image/ExifTool/Exif.pm
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::MakerNotes;
-$VERSION = '4.35';
+$VERSION = '4.36';
sub ProcessExif($$$);
sub WriteExif($$$);
@@ -5918,7 +5918,7 @@ sub ProcessExif($$$)
my $size = $count * $formatSize[$format];
my $readSize = $size;
if ($size > 4) {
- if ($size > 0x7fffffff) {
+ if ($size > 0x7fffffff and (not $tagInfo or not $$tagInfo{ReadFromRAF})) {
$et->Warn(sprintf("Invalid size (%u) for %s %s",$size,$dir,TagName($tagID,$tagInfo)), $inMakerNotes);
++$warnCount;
next;
diff --git a/lib/Image/ExifTool/FujiFilm.pm b/lib/Image/ExifTool/FujiFilm.pm
index d21b2108..cf5bcd23 100644
--- a/lib/Image/ExifTool/FujiFilm.pm
+++ b/lib/Image/ExifTool/FujiFilm.pm
@@ -489,6 +489,7 @@ my %faceCategories = (
3 => 'Electronic Front Curtain', #10
},
},
+ # 0x1100 - This may not work well for newer cameras (ref forum12682)
0x1100 => [{
Name => 'AutoBracketing',
Condition => '$$self{Model} eq "X-T3"',
diff --git a/lib/Image/ExifTool/ID3.pm b/lib/Image/ExifTool/ID3.pm
index f051b770..02be6e6f 100644
--- a/lib/Image/ExifTool/ID3.pm
+++ b/lib/Image/ExifTool/ID3.pm
@@ -18,11 +18,12 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.55';
+$VERSION = '1.57';
sub ProcessID3v2($$$);
sub ProcessPrivate($$$);
sub ProcessSynText($$$);
+sub ProcessID3Dir($$$);
sub ConvertID3v1Text($$);
sub ConvertTimeStamp($);
@@ -69,9 +70,10 @@ my %dateTimeConv = (
# This table is just for documentation purposes
%Image::ExifTool::ID3::Main = (
VARS => { NO_ID => 1 },
+ PROCESS_PROC => \&ProcessID3Dir, # (used to process 'id3 ' chunk in WAV files)
NOTES => q{
- ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, AIFF, OGG,
- FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
+ ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF,
+ OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
"Comment-spa"). See L<http://www.id3.org/> for the official ID3
@@ -1571,6 +1573,16 @@ sub ProcessID3($$)
}
#------------------------------------------------------------------------------
+# Process ID3 directory
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) dummy tag table ref
+sub ProcessID3Dir($$$)
+{
+ my ($et, $dirInfo, $tagTablePtr) = @_;
+ $et->VerboseDir('ID3', undef, length ${$$dirInfo{DataPt}});
+ return ProcessID3($et, $dirInfo);
+}
+
+#------------------------------------------------------------------------------
# Extract ID3 information from an MP3 audio file
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
# Returns: 1 on success, 0 if this wasn't a valid MP3 file
diff --git a/lib/Image/ExifTool/Lang/nl.pm b/lib/Image/ExifTool/Lang/nl.pm
index ddf5ec0b..081c0da3 100644
--- a/lib/Image/ExifTool/Lang/nl.pm
+++ b/lib/Image/ExifTool/Lang/nl.pm
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::nl;
use strict;
use vars qw($VERSION);
-$VERSION = '1.12';
+$VERSION = '1.13';
%Image::ExifTool::Lang::nl::Translate = (
'AEBAutoCancel' => {
@@ -1502,97 +1502,98 @@ $VERSION = '1.12';
'GIFVersion' => 'GIF versie',
'GPSAltitude' => 'Hoogte',
'GPSAltitudeRef' => {
- Description => 'Hoogte referentie',
+ Description => 'GPS hoogte - referentie',
PrintConv => {
- 'Above Sea Level' => 'Zee spiegel',
- 'Below Sea Level' => 'Zee spiegel referentie (negatieve waarde)',
+ 'Above Sea Level' => 'Boven zeeniveau',
+ 'Below Sea Level' => 'Onder zeeniveau',
},
},
- 'GPSAreaInformation' => 'Naam van het GPS gebied',
- 'GPSDOP' => 'Meet nauwkeurigheid',
- 'GPSDateStamp' => 'GPS datum',
- 'GPSDateTime' => 'GPS tijd (atoomklok)',
- 'GPSDestBearing' => 'Motiefrichting',
+ 'GPSAreaInformation' => 'GPS naam van het gebied',
+ 'GPSDOP' => 'GPS meetnauwkeurigheid',
+ 'GPSDateStamp' => 'GPS UTC datum',
+ 'GPSDateTime' => 'GPS UTC datum en tijd',
+ 'GPSDestBearing' => 'GPS peiling van bestemming',
'GPSDestBearingRef' => {
- Description => 'Referentie voor de motiefrichting',
+ Description => 'GPS peiling van bestemming - referentie',
PrintConv => {
- 'Magnetic North' => 'Magnetische uitrichting',
- 'True North' => 'Geografische uitrichting',
+ 'Magnetic North' => 'Magnetische noorden',
+ 'True North' => 'Geografische noorden',
},
},
- 'GPSDestDistance' => 'Afstand tot bestemming',
+ 'GPSDestDistance' => 'GPS afstand tot bestemming',
'GPSDestDistanceRef' => {
- Description => 'Referentie voor de afstand tot de bestemming',
+ Description => 'GPS afstand tot bestemming - referentie',
PrintConv => {
- 'Miles' => 'Mijlen',
- 'Nautical Miles' => 'Knopen',
+ 'Miles' => 'Engelse mijlen',
+ 'Nautical Miles' => 'Zeemijlen',
},
},
- 'GPSDestLatitude' => 'Breedte van het doel',
+ 'GPSDestLatitude' => 'GPS breedtegraad van bestemming',
'GPSDestLatitudeRef' => {
- Description => 'Referentie voor de breedte van het doel',
+ Description => 'GPS breedtegraad van bestemming - referentie',
PrintConv => {
- 'North' => 'Noordelijke breedte',
- 'South' => 'Zuidelijke breedte',
+ 'North' => 'Noorderbreedte',
+ 'South' => 'Zuiderbreedte',
},
},
- 'GPSDestLongitude' => 'Lengtegraad van het doel',
+ 'GPSDestLongitude' => 'GPS lengtegraad van bestemming',
'GPSDestLongitudeRef' => {
- Description => 'Referentie voor de lengte van het doel',
+ Description => 'GPS lengtegraad van bestemming - referentie',
PrintConv => {
- 'East' => 'Oostelijke lengte',
- 'West' => 'Westlijke lengte',
+ 'East' => 'Oosterlengte',
+ 'West' => 'Westerlengte',
},
},
'GPSDifferential' => {
Description => 'GPS differentiaal correctie',
PrintConv => {
- 'Differential Corrected' => 'Differentiaal correctie toegepast',
- 'No Correction' => 'Meting zonder differentiaal correctie',
+ 'Differential Corrected' => 'Met differentiaal correctie',
+ 'No Correction' => 'Zonder differentiaal correctie',
},
},
- 'GPSImgDirection' => 'Richting van de afbeelding',
+ 'GPSImgDirection' => 'GPS peiling van de afbeelding',
'GPSImgDirectionRef' => {
- Description => 'Referentie voor de uitrichting van de afbeelding',
+ Description => 'GPS peiling van de afbeelding - referentie',
PrintConv => {
- 'Magnetic North' => 'Magnetische uitrichting',
- 'True North' => 'Geografische uitrichting',
+ 'Magnetic North' => 'Magnetische noorden',
+ 'True North' => 'Geografische noorden',
},
},
- 'GPSInfo' => 'GPS Info IFD-wijzer',
- 'GPSLatitude' => 'Breedte graad',
+ 'GPSInfo' => 'GPS Info',
+ 'GPSLatitude' => 'GPS breedtegraad',
'GPSLatitudeRef' => {
- Description => 'Noord. of zuid. breedte',
+ Description => 'GPS breedtegraad - referentie',
PrintConv => {
- 'North' => 'Noordelijke breedte',
- 'South' => 'Zuidlijke breedte',
+ 'North' => 'Noorderbreedte',
+ 'South' => 'Zuiderbreedte',
},
},
- 'GPSLongitude' => 'Geografische lengte',
+ 'GPSLongitude' => 'GPS lengtegraad',
'GPSLongitudeRef' => {
- Description => 'Oost. of west. lengte',
+ Description => 'GPS lengtegraad - referentie',
PrintConv => {
- 'East' => 'Oostlijke lengte',
- 'West' => 'Westlijke lengte',
+ 'East' => 'Oosterlengte',
+ 'West' => 'Westerlengte',
},
},
- 'GPSMapDatum' => 'Geodatische datum',
+ 'GPSMapDatum' => 'GPS geodetisch datum',
'GPSMeasureMode' => {
- Description => 'GPS meet methode',
+ Description => 'GPS meetmethode',
PrintConv => {
- '2-D' => '2 dimensionale meting',
- '2-Dimensional' => '2 dimensionale meting',
- '2-Dimensional Measurement' => '2 dimensionale meting',
- '3-D' => '3 dimensionale meting',
- '3-Dimensional' => '3 dimensionale meting',
- '3-Dimensional Measurement' => '3 dimensionale meting',
+ '2-D' => 'Tweedimensionale meting',
+ '2-Dimensional' => 'Tweedimensionale meting',
+ '2-Dimensional Measurement' => 'Tweedimensionale meting',
+ '3-D' => 'Driedimensionale meting',
+ '3-Dimensional' => 'Driedimensionale meting',
+ '3-Dimensional Measurement' => 'Driedimensionale meting',
},
},
- 'GPSProcessingMethod' => 'Naam van de GPS verwerk methode',
- 'GPSSatellites' => 'Voor de meting gebruikte satellieten',
- 'GPSSpeed' => 'Snelheid van de GPS ontvanger',
+ 'GPSPosition' => 'GPS positie',
+ 'GPSProcessingMethod' => 'GPS verwerkingsmethode',
+ 'GPSSatellites' => 'GPS satellieten gebruikt voor de meting',
+ 'GPSSpeed' => 'GPS ontvanger bewegingssnelheid',
'GPSSpeedRef' => {
- Description => 'Snelheids eenheid',
+ Description => 'GPS ontvanger bewegingssnelheid - referentie',
PrintConv => {
'km/h' => 'Kilometer per uur',
'knots' => 'Knopen',
@@ -1602,20 +1603,20 @@ $VERSION = '1.12';
'GPSStatus' => {
Description => 'GPS ontvanger status',
PrintConv => {
- 'Measurement Active' => 'Meting loopt',
- 'Measurement Void' => 'Interoperabiliteit voor metingen',
+ 'Measurement Active' => 'Actuele meting beschikbaar',
+ 'Measurement Void' => 'Actuele meting niet beschikbaar',
},
},
- 'GPSTimeStamp' => 'GPS tijd (atoomklok)',
- 'GPSTrack' => 'Bewegingsrichting',
+ 'GPSTimeStamp' => 'GPS UTC tijd',
+ 'GPSTrack' => 'GPS ontvanger bewegingsrichting',
'GPSTrackRef' => {
- Description => 'Referentie voor de bewegingsrichting',
+ Description => 'GPS ontvanger bewegingsrichting - referentie',
PrintConv => {
- 'Magnetic North' => 'Magnetische uitrichting',
- 'True North' => 'Geographische uitrichting',
+ 'Magnetic North' => 'Magnetische noorden',
+ 'True North' => 'Geografische noorden',
},
},
- 'GPSVersionID' => 'GPS tag versie',
+ 'GPSVersionID' => 'GPS versie ID',
'GainControl' => {
Description => 'Belichtingsversterking',
PrintConv => {
diff --git a/lib/Image/ExifTool/M2TS.pm b/lib/Image/ExifTool/M2TS.pm
index 246fc839..0f81a5ed 100644
--- a/lib/Image/ExifTool/M2TS.pm
+++ b/lib/Image/ExifTool/M2TS.pm
@@ -356,7 +356,48 @@ sub ParsePID($$$$$)
}
SetByteOrder('MM');
$more = 1;
+ } elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) {
+ # $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d
+ # $GSNRINFO,0.01,0.04,0.25\0
+ $$dataPt =~ tr/\x0d/\x0a/;
+ $$dataPt =~ tr/\0//d;
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
+ my @lines = split /\x0a/, $$dataPt;
+ my ($line, $lastTime);
+ foreach $line (@lines) {
+ if ($line =~ /^\$GPSINFO/) {
+ my @a = split /,/, $lines[0];
+ next unless @a > 7;
+ # ignore duplicate fixes
+ next if $lastTime and $a[2] eq $lastTime;
+ $lastTime = $a[2];
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
+ $a[2] =~ tr/./:/;
+ # (untested, and probably doesn't work for S/W hemispheres)
+ my ($lat, $lon) = @a[3,4];
+ my $deg = int($lat / 100);
+ $lat = $deg + ($lat - $deg * 100) / 60;
+ $deg = int($lon / 100);
+ $lon = $deg + ($lon - $deg * 100) / 60;
+ # $a[0] - flags? values: '0x0001','0x0004','0x0008','0x0010'
+ $et->HandleTag($tagTbl, GPSDateTime => $a[2]);
+ $et->HandleTag($tagTbl, GPSLatitude => $lat);
+ $et->HandleTag($tagTbl, GPSLongitude => $lon);
+ $et->HandleTag($tagTbl, GPSSpeed => $a[5]);
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
+ # $a[6] - values: 48-60
+ $et->HandleTag($tagTbl, GPSTrack => $a[7]);
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
+ # #a[8,9] - always 0
+ } elsif ($line =~ /^\$GSNRINFO/) {
+ my @a = split /,/, $line;
+ shift @a;
+ $et->HandleTag($tagTbl, Accelerometer => "@a");
+ }
+ }
+ $more = 1;
}
+ delete $$et{DOC_NUM};
}
return $more;
}
@@ -408,14 +449,21 @@ sub ProcessM2TS($$)
);
my %didPID = ( 1 => 0, 2 => 0, 0x1fff => 0 );
my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse
+ # PID's that may contain GPS info
+ my %gpsPID = (
+ 0x0300 => 1, # Novatek INNOVV
+ 0x01e4 => 1, # vsys a6l dashcam
+ );
my $pEnd = 0;
- # scan entire file for GPS program 0x0300 if ExtractEmbedded option is 3 or higher
- # (some dashcams write this program but don't include it in the PMT)
+ # scan entire file for GPS programs if ExtractEmbedded option is 3 or higher
+ # (some dashcams write these programs but don't include it in the PMT)
if (($et->Options('ExtractEmbedded') || 0) > 2) {
- $needPID{0x0300} = 1;
- $pidType{0x0300} = -1;
- $pidName{0x0300} = 'unregistered dashcam GPS';
+ foreach (keys %gpsPID) {
+ $needPID{$_} = 1;
+ $pidType{$_} = -1;
+ $pidName{$_} ='unregistered dashcam GPS';
+ }
}
# parse packets from MPEG-2 Transport Stream
@@ -704,7 +752,11 @@ sub ProcessM2TS($$)
}
$data{$pid} = substr($buff, $pos, $pEnd-$pos);
} else {
- next unless defined $data{$pid};
+ unless (defined $data{$pid}) {
+ # (vsys a6l dashcam GPS record doesn't have a start indicator)
+ next unless $gpsPID{$pid};
+ $data{$pid} = '';
+ }
# accumulate data for each elementary stream
$data{$pid} .= substr($buff, $pos, $pEnd-$pos);
}
diff --git a/lib/Image/ExifTool/Nikon.pm b/lib/Image/ExifTool/Nikon.pm
index f7721622..700ba968 100644
--- a/lib/Image/ExifTool/Nikon.pm
+++ b/lib/Image/ExifTool/Nikon.pm
@@ -62,7 +62,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
-$VERSION = '3.98';
+$VERSION = '3.99';
sub LensIDConv($$$);
sub ProcessNikonAVI($$$);
@@ -556,6 +556,7 @@ sub GetAFPointGrid($$;$);
'F3 54 2B 50 24 24 84 0E' => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)',
'00 3F 2D 80 2B 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)',
'00 3F 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)',
+ 'EC 3E 3C 8E 2C 40 DF 0E' => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD A010', #30
'00 40 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #NJ
'FC 40 2D 80 2C 40 DF 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #PH (NC)
'E6 40 2D 80 2C 40 DF 0E' => 'Tamron 18-200mm f/3.5-6.3 Di II VC (B018)', #Tanel (removed AF designation, ref 37)
@@ -614,6 +615,7 @@ sub GetAFPointGrid($$;$);
'7A 48 1C 29 24 24 7E 06' => 'Tokina AT-X 116 PRO DX II (AF 11-16mm f/2.8)',
'80 48 1C 29 24 24 7A 06' => 'Tokina atx-i 11-16mm F2.8 CF', #exiv2 issue 1078
'7A 48 1C 30 24 24 7E 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)',
+ '8B 48 1C 30 24 24 85 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)', #forum12687
'00 3C 1F 37 30 30 00 06' => 'Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)',
'7A 3C 1F 37 30 30 7E 06.2' => 'Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)',
'7A 3C 1F 3C 30 30 7E 06' => 'Tokina AT-X 12-28 PRO DX (AF 12-28mm f/4)',
@@ -720,6 +722,9 @@ sub GetAFPointGrid($$;$);
'00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
'00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
'4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30
+#
+ 'A0 56 44 44 14 14 A2 06' => 'Sony FE 35mm F1.8', #IB (Techart adapter)
+ 'A0 37 5C 8E 34 3C A2 06' => 'Sony FE 70-300mm F4.5-5.6 G OSS', #IB (Techart adapter)
);
# text encoding used in LocationInfo (ref PH)
@@ -8497,8 +8502,8 @@ my %nikonFocalConversions = (
# 0x02 - undef[148]
# 0x03 - undef[284]
# 0x04 - undef[148,212]
- # 0x05 - undef[84]
- # 0x06 - undef[116]
+ # 0x05 - undef[84] (barrel distortion params at offsets 0x14,0x1c,0x24, ref 28)
+ # 0x06 - undef[116] (vignette correction params at offsets 0x24,0x34,0x44, ref 28)
# 0x07 - undef[104]
# 0x08 - undef[24]
# 0x09 - undef[36]
diff --git a/lib/Image/ExifTool/NikonSettings.pm b/lib/Image/ExifTool/NikonSettings.pm
index f2194e80..ecb6945e 100644
--- a/lib/Image/ExifTool/NikonSettings.pm
+++ b/lib/Image/ExifTool/NikonSettings.pm
@@ -17,7 +17,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.03';
+$VERSION = '1.04';
sub ProcessNikonSettings($$$);
@@ -592,7 +592,7 @@ my %infoD6 = (
},
},
0x026 => { Name => 'AF-AssistIlluminator', PrintConv => \%onOff }, # CSa11 (Z7_2)
- # 0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa18 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens
+ 0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa12 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens
0x029 => { Name => 'ISOStepSize', PrintConv => \%thirdHalfFull }, # CSb1 (D6)
0x02a => { Name => 'ExposureControlStepSize', PrintConv => \%thirdHalfFull }, # CSb2 (D6), CSb1 (Z7_2)
0x02b => { # CSb4 (D6), CSb2 (Z7_2)
@@ -1920,6 +1920,14 @@ my %infoD6 = (
},
},
0x170 => { Name => 'PreferSubSelectorCenter', PrintConv => \%offOn }, # CSf13 (D6 firmware v1.2.0)
+ 0x171 => { # CSb8 (D6 firmware v1.3.0)
+ Name => 'KeepExposureWithTeleconverter',
+ PrintConv => {
+ 1 => 'Off',
+ 2 => 'Shutter Speed',
+ 3 => 'ISO',
+ },
+ },
0x174 => { # CSa17-d (D6 firmware v1.2.0)
Name => 'FocusPointSelectionSpeed',
PrintConv => {
diff --git a/lib/Image/ExifTool/Olympus.pm b/lib/Image/ExifTool/Olympus.pm
index 49213c47..930aef88 100644
--- a/lib/Image/ExifTool/Olympus.pm
+++ b/lib/Image/ExifTool/Olympus.pm
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::APP12;
-$VERSION = '2.73';
+$VERSION = '2.74';
sub PrintLensInfo($$$);
@@ -431,6 +431,7 @@ my %olympusCameraTypes = (
S0085 => 'E-PL10', #IB
S0089 => 'E-M5MarkIII',
S0092 => 'E-M1MarkIII', #IB
+ S0093 => 'E-P7', #IB
SR45 => 'D220',
SR55 => 'D320L',
SR83 => 'D340L',
diff --git a/lib/Image/ExifTool/Other.pm b/lib/Image/ExifTool/Other.pm
new file mode 100644
index 00000000..0eb96faa
--- /dev/null
+++ b/lib/Image/ExifTool/Other.pm
@@ -0,0 +1,93 @@
+#------------------------------------------------------------------------------
+# File: Other.pm
+#
+# Description: Read meta information from other uncommon formats
+#
+# Revisions: 2021/07/16 - P. Harvey Created
+#
+# References: 1) PFM - http://www.pauldebevec.com/Research/HDR/PFM/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Other;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.00';
+
+# Other info
+%Image::ExifTool::Other::PFM = (
+ GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
+ VARS => { NO_ID => 1 },
+ NOTES => q{
+ Tags extracted from Portable FloatMap images. See
+ L<http://www.pauldebevec.com/Research/HDR/PFM/> for the specification.
+ },
+ ColorSpace => { PrintConv => { PF => 'RGB', 'Pf' => 'Monochrome'} },
+ ImageWidth => { },
+ ImageHeight => { },
+ ByteOrder => { PrintConv => '$val > 0 ? "Big-endian" : "Little-endian"' },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from a Portable FloatMap image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid PFM file
+sub ProcessPFM2($$)
+{
+ my ($et, $dirInfo) = @_;
+ my $raf = $$dirInfo{RAF};
+ my $buff;
+ return 0 unless $raf->Read($buff, 256) and $buff =~ /^(P[Ff])\x0a(\d+) (\d+)\x0a([-+0-9.]+)\x0a/;
+ $et->SetFileType('PFM', 'image/x-pfm');
+ my $tagTablePtr = GetTagTable('Image::ExifTool::Other::PFM');
+ $et->HandleTag($tagTablePtr, ColorSpace => $1);
+ $et->HandleTag($tagTablePtr, ImageWidth => $2);
+ $et->HandleTag($tagTablePtr, ImageHeight => $3);
+ $et->HandleTag($tagTablePtr, ByteOrder => $4);
+ # hack to set proper file description (extension is the same for Printer Font Metrics files)
+ $Image::ExifTool::static_vars{OverrideFileDescription}{PFM} = 'Portable FloatMap',
+ return 1;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Other - Read meta information from other uncommon formats
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from Portable FloatMap (PFM) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item PFM L<http://www.pauldebevec.com/Research/HDR/PFM/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Other Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
diff --git a/lib/Image/ExifTool/QuickTime.pm b/lib/Image/ExifTool/QuickTime.pm
index 03ba0244..df70e581 100644
--- a/lib/Image/ExifTool/QuickTime.pm
+++ b/lib/Image/ExifTool/QuickTime.pm
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
-$VERSION = '2.67';
+$VERSION = '2.68';
sub ProcessMOV($$;$);
sub ProcessKeys($$$);
@@ -734,6 +734,10 @@ my %eeBox2 = (
Unknown => 1,
Binary => 1,
},
+ sefd => {
+ Name => 'SamsungTrailer',
+ SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' },
+ },
);
# MPEG-4 'ftyp' atom
@@ -2264,6 +2268,12 @@ my %eeBox2 = (
# opax - 164 bytes unknown (center and affine arrays? ref 26)
# opai - 32 bytes (maybe contains a serial number starting at byte 16? - PH) (rgb gains, degamma, gamma? ref 26)
# intv - 16 bytes all zero
+ # ---- Xaiomi ----
+ mcvr => {
+ Name => 'PreviewImage',
+ Groups => { 2 => 'Preview' },
+ Binary => 1,
+ },
# ---- Unknown ----
# CDET - 128 bytes (unknown origin)
# mtyp - 4 bytes all zero (some drone video)
@@ -2701,6 +2711,7 @@ my %eeBox2 = (
colr => [{
Name => 'ICC_Profile',
Condition => '$$valPt =~ /^(prof|rICC)/',
+ Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
SubDirectory => {
TagTable => 'Image::ExifTool::ICC_Profile::Main',
Start => 4,
diff --git a/lib/Image/ExifTool/QuickTimeStream.pl b/lib/Image/ExifTool/QuickTimeStream.pl
index bb7530fc..1bbabdf8 100644
--- a/lib/Image/ExifTool/QuickTimeStream.pl
+++ b/lib/Image/ExifTool/QuickTimeStream.pl
@@ -98,7 +98,7 @@ my %insvLimit = (
The tags below are extracted from timed metadata in QuickTime and other
formats of video files when the ExtractEmbedded option is used. Although
most of these tags are combined into the single table below, ExifTool
- currently reads 53 different formats of timed GPS metadata from video files.
+ currently reads 55 different formats of timed GPS metadata from video files.
},
VARS => { NO_ID => 1 },
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -1230,7 +1230,10 @@ sub ProcessSamples($)
$et->VPrint(1, "${hdr}, Sample ".($i+1).' of '.scalar(@$start)." ($size bytes)\n");
$et->VerboseDump(\$buff, Addr => $$start[$i]);
}
- if ($type eq 'text') {
+ if ($type eq 'text' or
+ # (PNDM is normally 'text', but was sbtl/tx3g in concatenated Garmin sample output_3videos.mp4)
+ ($type eq 'sbtl' and $metaFormat eq 'tx3g' and $buff =~ /^..PNDM/s))
+ {
FoundSomething($et, $tagTbl, $time[$i], $dur[$i]);
unless ($buff =~ /^\$BEGIN/) {
diff --git a/lib/Image/ExifTool/RIFF.pm b/lib/Image/ExifTool/RIFF.pm
index 39a27f48..e88c1752 100644
--- a/lib/Image/ExifTool/RIFF.pm
+++ b/lib/Image/ExifTool/RIFF.pm
@@ -30,7 +30,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.58';
+$VERSION = '1.59';
sub ConvertTimecode($);
sub ProcessSGLT($$$);
@@ -527,6 +527,10 @@ my %code2charset = (
Name => 'Text',
Notes => 'streamed text, extracted when the ExtractEmbedded option is used',
},
+ 'id3 ' => {
+ Name => 'ID3',
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::Main' },
+ },
#
# WebP-specific tags
#
@@ -818,6 +822,7 @@ my %code2charset = (
ILGT => 'Lightness',
IMED => 'Medium',
INAM => 'Title',
+ ITRK => 'TrackNumber',
IPLT => 'NumColors',
IPRD => 'Product',
ISBJ => 'Subject',
diff --git a/lib/Image/ExifTool/Samsung.pm b/lib/Image/ExifTool/Samsung.pm
index 680b16d2..412c327e 100644
--- a/lib/Image/ExifTool/Samsung.pm
+++ b/lib/Image/ExifTool/Samsung.pm
@@ -22,12 +22,13 @@ use vars qw($VERSION %samsungLensTypes);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.49';
+$VERSION = '1.50';
sub WriteSTMN($$$);
sub ProcessINFO($$$);
sub ProcessSamsungMeta($$$);
sub ProcessSamsungIFD($$$);
+sub ProcessSamsung($$$);
# Samsung LensType lookup
%samsungLensTypes = (
@@ -940,14 +941,31 @@ my %formatMinMax = (
%Image::ExifTool::Samsung::Trailer = (
GROUPS => { 0 => 'MakerNotes', 2 => 'Other' },
VARS => { NO_ID => 1, HEX_ID => 0 },
+ PROCESS_PROC => \&ProcessSamsung,
PRIORITY => 0, # (first one takes priority so DepthMapWidth/Height match first DepthMapData)
NOTES => q{
Tags extracted from the trailer of JPEG images written when using certain
features (such as "Sound & Shot" or "Shot & More") from Samsung models such
- as the Galaxy S4 and Tab S.
- },
- '0x0001-name' => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
- '0x0001' => { Name => 'EmbeddedImage', Groups => { 2 => 'Preview' }, Binary => 1 },
+ as the Galaxy S4 and Tab S, and from the 'sefd' atom in HEIC images from the
+ Samsung S10+.
+ },
+ '0x0001-name' => {
+ Name => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
+ RawConv => '$$self{EmbeddedImageName} = $val',
+ },
+ '0x0001' => [
+ {
+ Name => 'EmbeddedImage',
+ Condition => '$$self{EmbeddedImageName} eq "DualShot_1"',
+ Groups => { 2 => 'Preview' },
+ Binary => 1,
+ },
+ {
+ Name => 'EmbeddedImage2',
+ Groups => { 2 => 'Preview' },
+ Binary => 1,
+ },
+ ],
'0x0100-name' => 'EmbeddedAudioFileName', # ("SoundShot_000")
'0x0100' => { Name => 'EmbeddedAudioFile', Groups => { 2 => 'Audio' }, Binary => 1 },
'0x0201-name' => 'SurroundShotVideoName', # ("Interactive_Panorama_000")
@@ -977,10 +995,24 @@ my %formatMinMax = (
'0x0a30-name' => 'EmbeddedVideoType', # ("MotionPhoto_Data")
'0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161
# 0x0aa1-name - seen 'MCC_Data'
- # 0x0aa1 - seen '234','222','429'
+ # 0x0aa1 - seen '204','222','234','302','429'
+ '0x0aa1' => 'MCCData', # (unknown meaning)
# 0x0ab0-name - seen 'DualShot_Meta_Info'
- '0x0ab1-name' => 'DepthMapName', # seen 'DualShot_DepthMap_1' (SM-N950U)
- '0x0ab1' => { Name => 'DepthMapData', Binary => 1 },
+ '0x0ab1-name' => {
+ Name => 'DepthMapName',
+ # seen 'DualShot_DepthMap_1' (SM-N950U), DualShot_DepthMap_5 (SM-G998W)
+ RawConv => '$$self{DepthMapName} = $val',
+ },
+ '0x0ab1' => [
+ {
+ Name => 'DepthMapData',
+ Condition => '$$self{DepthMapName} eq "DualShot_DepthMap_1"',
+ Binary => 1,
+ },{
+ Name => 'DepthMapData2',
+ Binary => 1,
+ },
+ ],
# 0x0ab3-name - seen 'DualShot_Extra_Info' (SM-N950U)
'0x0ab3' => { # (SM-N950U)
Name => 'DualShotExtra',
@@ -1015,7 +1047,8 @@ my %formatMinMax = (
Hook => q{
if ($size >= 96) {
my $tmp = substr($$dataPt, $pos, 64);
- if ($tmp =~ /\x01\0\xff\xff/g and not pos($tmp) % 4) {
+ # (have seen 0x01,0x03 and 0x07)
+ if ($tmp =~ /[\x01-\x09]\0\xff\xff/g and not pos($tmp) % 4) {
$$self{DepthMapTagPos} = pos($tmp);
$varSize += $$self{DepthMapTagPos} - 32;
}
@@ -1274,6 +1307,10 @@ sub ProcessSamsung($$$)
my $unknown = $et->Options('Unknown');
my ($buff, $buf2, $index, $offsetPos, $audioNOff, $audioSize);
+ unless ($raf) {
+ $raf = new File::RandomAccess($$dirInfo{DataPt});
+ $et->VerboseDir('SamsungTrailer');
+ }
return 0 unless $raf->Seek(-6-$offset, 2) and $raf->Read($buff, 6) == 6 and
($buff eq 'QDIOBS' or $buff eq "\0\0SEFT");
my $endPos = $raf->Tell();
@@ -1328,7 +1365,7 @@ SamBlock:
# save trailer position and length
my $dataPos = $$dirInfo{DataPos} = $dirPos - $firstBlock;
my $dirLen = $$dirInfo{DirLen} = $endPos - $dataPos;
- if (($verbose or $$et{HTML_DUMP}) and not $outfile) {
+ if (($verbose or $$et{HTML_DUMP}) and not $outfile and $$dirInfo{RAF}) {
$et->DumpTrailer($dirInfo);
return 1 if $$et{HTML_DUMP};
}
diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm
index 3005fbc9..66d34c29 100644
--- a/lib/Image/ExifTool/Sony.pm
+++ b/lib/Image/ExifTool/Sony.pm
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::Minolta;
-$VERSION = '3.43';
+$VERSION = '3.44';
sub ProcessSRF($$$);
sub ProcessSR2($$$);
@@ -196,6 +196,7 @@ sub PrintInvLensSpec($;$$);
49465 => 'Tamron 17-70mm F2.8 Di III-A VC RXD', #JR (Model B070)
49466 => 'Tamron 150-500mm F5-6.7 Di III VC VXD', #JR (Model A057)
49467 => 'Tamron 11-20mm F2.8 Di III-A RXD', #JR (Model B060)
+
49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
49473.1 => 'Viltrox 23mm F1.4 E', #JR
49473.2 => 'Viltrox 56mm F1.4 E', #JR
@@ -234,6 +235,7 @@ sub PrintInvLensSpec($;$$);
50524 => 'Sigma 35mm F2 DG DN | C', #IB (020)
50525 => 'Sigma 24mm F3.5 DG DN | C', #JR (021)
50526 => 'Sigma 28-70mm F2.8 DG DN | C', #JR (021)
+ 50527 => 'Sigma 150-600mm F5-6.3 DG DN OS | S', #JR (021)
50528 => 'Sigma 35mm F1.4 DG DN | A', #IB/JR (021)
50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
@@ -264,7 +266,7 @@ sub PrintInvLensSpec($;$$);
51510 => 'Samyang AF 18mm F2.8 or Samyang AF 35mm F1.8', #JR
51510.1 => 'Samyang AF 35mm F1.8', #JR
51512 => 'Samyang AF 75mm F1.8', #IB/JR
- 51514 => 'Samyang AF 24mm F1.8 FE', #IB
+ 51514 => 'Samyang AF 24mm F1.8', #IB
);
# ExposureProgram values (ref PH, mainly decoded from A200)
@@ -1027,7 +1029,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
},{
Name => 'Tag2010i', # ?
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-1)\b/',
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-(1|E10))\b/',
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
},{
Name => 'Tag_0x2010',
@@ -1609,7 +1611,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
},
},{
Name => 'Tag9050b',
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3A?|7RM4A?|7SM2|9|9M2)|ILCA-99M2)/',
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3A?|7RM4A?|7SM2|9|9M2)|ILCA-99M2|ZV-E10)/',
SubDirectory => {
TagTable => 'Image::ExifTool::Sony::Tag9050b',
ByteOrder => 'LittleEndian',
@@ -1635,7 +1637,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
# 0x23 (e) for DSC-RX10/HX60V/HX350/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-68/77M2
# 0x24 (e) for ILCA-99M2,ILCE-5100/6300/6500/7M2/7RM2/7S/7SM2/QX1, DSC-HX80/HX90V/QX30/RX0/RX100M3/RX100M4/RX100M5/RX10M2/RX10M3/RX1RM2/WX500
# 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99
- # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1
+ # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/E10
# 0x31 (e) for ILCE-1/7SM3, ILME-FX3
# first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106 respectively
{
@@ -1651,7 +1653,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400b' },
},{
Name => 'Tag9400c',
- Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31]/',
+ Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31]/',
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400c' },
},{
Name => 'Sony_0x9400',
@@ -1810,7 +1812,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
# 142 var (0x25 = 37 var enc.) DSC-HX80/HX90V/RX1RM2/RX10M2/RX10M3/RX100M4/WX500, ILCE-6300/7RM2/7SM2
# 144 var (0xe1 = 225 var enc.) DSC-RX100M5
# 145 var (0x76 = 118 var enc.) ILCA-99M2, ILCE-6500, DSC-RX0
- # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99, ZV-1
+ # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99, ZV-1/E10
# July 2020: ILCE-7SM3 doesn't write this tag anymore, but writes 0x9416
0x9405 => [{
Name => 'Tag9405a',
@@ -1864,7 +1866,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
},
0x940c => [{
Name => 'Tag940c',
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar)\b/',
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar|ZV-E10)\b/',
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940c' },
},{
Name => 'Sony_0x940c',
@@ -2020,6 +2022,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
379 => 'ILCE-6100', #IB/JR
380 => 'ZV-1', #JR
381 => 'ILCE-7C', #JR
+ 382 => 'ZV-E10', #JR
383 => 'ILCE-7SM3',
384 => 'ILCE-1', #PH
385 => 'ILME-FX3', #JR
@@ -6182,7 +6185,7 @@ my %isoSetting2010 = (
43 => 160000,
44 => 204800,
45 => 256000,
- 46 => 320000,
+ 46 => 320000,
47 => 409600,
);
@@ -7610,7 +7613,7 @@ my %isoSetting2010 = (
# March 2019: ILCE-9 with v5.0x firmware follows ILCE-6400 in many tags ...
0x0050 => {
Name => 'ShutterCount2',
- Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4A?|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/)',
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4A?|9M2)|ZV-E10)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/)',
Format => 'int32u',
RawConv => '$val & 0x00ffffff',
},
@@ -7627,13 +7630,13 @@ my %isoSetting2010 = (
# 0x0058, 0x0061: E-Mount: ShutterCount and dateTime
0x0058 => { # appears not valid when flash is used ... not for ILCA-99M2
Name => 'ShutterCount2',
- Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2))/) and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2)|ZV-E10)/) and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
Format => 'int32u',
RawConv => '$val & 0x00ffffff',
},
0x0061 => { # only minutes-seconds, not for ILCA-99M2, ILCE-9
Name => 'SonyTimeMinSec',
- Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2))/',
+ Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)/',
Format => 'undef[2]',
ValueConv => q{
my @v = unpack('C*', $val);
@@ -7642,7 +7645,7 @@ my %isoSetting2010 = (
},
0x006b => {
Name => 'ReleaseMode2',
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4A?|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4A?|9M2)|ZV-E10)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
%releaseMode2,
},
0x006d => {
@@ -7652,7 +7655,7 @@ my %isoSetting2010 = (
},
0x0073 => {
Name => 'ReleaseMode2',
- Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2))/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
+ Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2)|ZV-E10)/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
%releaseMode2,
},
0x0088 => {
@@ -7731,7 +7734,7 @@ my %isoSetting2010 = (
#
0x019f => {
Name => 'ShutterCount3',
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2))\b/',
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)\b/',
Format => 'int32u',
RawConv => '$val == 0 ? undef : $val',
},
@@ -7749,7 +7752,7 @@ my %isoSetting2010 = (
},
0x01eb => {
Name => 'APS-CSizeCapture',
- Condition => '$$self{Model} =~ /^ILCE-(7RM4A?|7C|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
+ Condition => '$$self{Model} =~ /^ILCE-(7RM4A?|7C|9M2)|ZV-E10/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
PrintConv => {
0 => 'Off',
1 => 'On',
@@ -7757,7 +7760,7 @@ my %isoSetting2010 = (
},
0x01ed => {
Name => 'LensSpecFeatures',
- Condition => '$$self{Model} =~ /^ILCE-(7RM4A?|7C|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
+ Condition => '$$self{Model} =~ /^ILCE-(7RM4A?|7C|9M2)|ZV-E10/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
Priority => 0,
Format => 'undef[2]',
ValueConv => 'join " ", unpack "H2H2", $val',
@@ -8701,7 +8704,7 @@ my %isoSetting2010 = (
},
0x034e => {
Name => 'LensZoomPosition',
- Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2))/',
+ Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2)|ZV-E10)/',
Format => 'int16u',
PrintConv => 'sprintf("%.0f%%",$val/10.24)',
PrintConvInv => '$val=~s/ ?%$//; $val * 10.24',
@@ -8713,7 +8716,7 @@ my %isoSetting2010 = (
},
0x035c => {
Name => 'VignettingCorrParams',
- Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2))/',
+ Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)/',
Format => 'int16s[16]',
},
0x035a => {
@@ -8750,7 +8753,7 @@ my %isoSetting2010 = (
},
0x03b8 => {
Name => 'ChromaticAberrationCorrParams',
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2))/',
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)/',
Format => 'int16s[32]',
},
);
diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm
index 681ec9ab..d8a3755a 100644
--- a/lib/Image/ExifTool/TagLookup.pm
+++ b/lib/Image/ExifTool/TagLookup.pm
@@ -4780,7 +4780,7 @@ my %tagLookup = (
'previewcroptop' => { 357 => 0xed },
'previewdate' => { 369 => 0x0 },
'previewdatetime' => { 117 => 0xc71b },
- 'previewimage' => { 111 => 0x2000, 112 => 'Exif-PreviewImage', 118 => 'PreviewImage', 120 => 0x4, 163 => 'data', 183 => 0x81, 293 => 0x280, 309 => 0x300, 411 => 0x2001 },
+ 'previewimage' => { 111 => 0x2000, 112 => 'Exif-PreviewImage', 118 => 'PreviewImage', 120 => 0x4, 163 => 'data', 183 => 0x81, 293 => 0x280, 309 => 0x300, 371 => 'mcvr', 411 => 0x2001 },
'previewimageborders' => { 346 => 0x3e },
'previewimageheight' => { 71 => 0x4, 139 => 0xfa58 },
'previewimagelength' => { 71 => 0x2, 111 => 0x3, 117 => [0x117,0x202], 183 => 0x89, 227 => 0x202, 288 => 0x102, 293 => 0x1037, 346 => 0x3, 377 => 0x1e, 382 => 0x3, 388 => [0x1b,0x1d], 401 => 0x202 },
@@ -7610,6 +7610,7 @@ my %tagExists = (
'depthhwheight' => 1,
'depthhwwidth' => 1,
'depthmapdata' => 1,
+ 'depthmapdata2' => 1,
'depthmapheight' => 1,
'depthmapname' => 1,
'depthmaptiff' => 1,
@@ -7806,6 +7807,7 @@ my %tagExists = (
'embeddedfilename' => 1,
'embeddedfileusagerights' => 1,
'embeddedimage' => 1,
+ 'embeddedimage2' => 1,
'embeddedimagecolorspace' => 1,
'embeddedimagefilter' => 1,
'embeddedimageheight' => 1,
@@ -8743,6 +8745,7 @@ my %tagExists = (
'k4' => 1,
'kbytesize' => 1,
'kdc_ifd' => 1,
+ 'keepexposurewithteleconverter' => 1,
'keepuntil' => 1,
'kelvinwb' => 1,
'keycode' => 1,
@@ -9022,6 +9025,7 @@ my %tagExists = (
'makernotes' => 1,
'mandatorybackground' => 1,
'manualfocuspointillumination' => 1,
+ 'manualfocusringinafmode' => 1,
'manufacturecode' => 1,
'manufactureindex' => 1,
'manufacturername' => 1,
@@ -9060,6 +9064,7 @@ my %tagExists = (
'maxval' => 1,
'maxwidth' => 1,
'mc' => 1,
+ 'mccdata' => 1,
'mcdi' => 1,
'md5signature' => 1,
'md5sum' => 1,
@@ -10326,6 +10331,7 @@ my %tagExists = (
'samsungsmta' => 1,
'samsungsvss' => 1,
'samsungtags' => 1,
+ 'samsungtrailer' => 1,
'samsunguniqueid' => 1,
'sanyomov' => 1,
'sanyomp4' => 1,
diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod
index 9852e7d8..5931b5b3 100644
--- a/lib/Image/ExifTool/TagNames.pod
+++ b/lib/Image/ExifTool/TagNames.pod
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
=head1 TAG TABLES
The tables listed below give the names of all tags recognized by ExifTool.
-They contain a total of 24286 tags, with 15747 unique tag names.
+They contain a total of 24297 tags, with 15752 unique tag names.
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -3519,7 +3519,8 @@ These tags belong to the ExifTool XMP-iptcCore family 1 group.
This table contains tags defined by the IPTC Extension schema version 1.5.
The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
-the family 1 group name. (see L<http://www.iptc.org/IPTC4XMP/>)
+the family 1 group name. (see
+L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>)
These tags belong to the ExifTool XMP-iptcExt family 1 group.
@@ -5937,6 +5938,7 @@ Unknown only to reduce the volume of the normal output.
0x0023 FocusPointWrap no
0x0025 ManualFocusPointIllumination no
0x0026 AF-AssistIlluminator no
+ 0x0027 ManualFocusRingInAFMode no
0x0029 ISOStepSize no
0x002a ExposureControlStepSize no
0x002b EasyExposureCompensation no
@@ -6115,6 +6117,7 @@ Unknown only to reduce the volume of the normal output.
0x016c LimitAF-AreaModeSelWideLAnimals? no
0x016e AFAreaMode no
0x0170 PreferSubSelectorCenter no
+ 0x0171 KeepExposureWithTeleconverter no
0x0174 FocusPointSelectionSpeed no
=head2 Canon Tags
@@ -17040,11 +17043,13 @@ Camera orientation information written by the Gear 360 (SM-C200).
Tags extracted from the trailer of JPEG images written when using certain
features (such as "Sound & Shot" or "Shot & More") from Samsung models such
-as the Galaxy S4 and Tab S.
+as the Galaxy S4 and Tab S, and from the 'sefd' atom in HEIC images from the
+Samsung S10+.
Tag Name Writable
-------- --------
DepthMapData no
+ DepthMapData2 no
DepthMapName no
DualCameraImage no
DualCameraImageName no
@@ -17052,9 +17057,11 @@ as the Galaxy S4 and Tab S.
EmbeddedAudioFile no
EmbeddedAudioFileName no
EmbeddedImage no
+ EmbeddedImage2 no
EmbeddedImageName no
EmbeddedVideoFile no
EmbeddedVideoType no
+ MCCData no
SingleShotDepthMap no
SingleShotMeta Samsung SingleShotMeta
SurroundShotVideo no
@@ -24792,6 +24799,18 @@ specification.
'software' Software no
'view' View no
+=head3 Other PFM Tags
+
+Tags extracted from Portable FloatMap images. See
+L<http://www.pauldebevec.com/Research/HDR/PFM/> for the specification.
+
+ Tag Name Writable
+ -------- --------
+ ByteOrder no
+ ColorSpace no
+ ImageHeight no
+ ImageWidth no
+
=head2 PDF Tags
The tags listed in the PDF tables below are those which are used by ExifTool
@@ -25103,8 +25122,8 @@ Additional document permissions imposed by digital signatures.
=head2 ID3 Tags
-ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, AIFF, OGG,
-FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
+ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF,
+OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
"Comment-spa"). See L<http://www.id3.org/> for the official ID3
@@ -26034,6 +26053,7 @@ for the official specification.
'pict' PreviewPICT no
'pnot' Preview QuickTime Preview
'prrt' ARDroneTelemetry no
+ 'sefd' SamsungTrailer Samsung Trailer
'skip' CanonSkip Canon Skip
PreviewImage no
Skip? no
@@ -26078,7 +26098,7 @@ Tags found in Pittasoft Blackvue dashcam "free" data.
The tags below are extracted from timed metadata in QuickTime and other
formats of video files when the ExtractEmbedded option is used. Although
most of these tags are combined into the single table below, ExifTool
-currently reads 53 different formats of timed GPS metadata from video files.
+currently reads 55 different formats of timed GPS metadata from video files.
Tag Name Writable
-------- --------
@@ -27233,6 +27253,7 @@ the config file.
'lrcu' LyricsURI string
'lvlm' LevelMeter? rational64s
'manu' Make no
+ 'mcvr' PreviewImage string
'meta' Meta QuickTime Meta
'modl' Model no
'name' Name string
@@ -30093,6 +30114,7 @@ sub-documents, but the Duration is calculated for the full video.
'gps0' GPSTrack QuickTime Stream
'gsen' GSensor QuickTime Stream
'iXML' IXML XMP XML
+ 'id3 ' ID3 ID3
'inst' Instrument RIFF Instrument
'labl' CuePointLabel no
'list' ListType no
@@ -30214,6 +30236,7 @@ by some software.
'ISTD' ProductionStudio no
'ISTR' Starring no
'ITCH' Technician no
+ 'ITRK' TrackNumber no
'IWMU' WatermarkURL no
'IWRI' WrittenBy no
'LANG' Language no
diff --git a/lib/Image/ExifTool/WriteQuickTime.pl b/lib/Image/ExifTool/WriteQuickTime.pl
index 30875887..3a6c9a99 100644
--- a/lib/Image/ExifTool/WriteQuickTime.pl
+++ b/lib/Image/ExifTool/WriteQuickTime.pl
@@ -1089,7 +1089,9 @@ sub WriteQuickTime($$$)
$$et{CHANGED} = $oldChanged if $$et{DemoteErrors} > 1;
delete $$et{DemoteErrors};
}
- if (defined $newData and not length $newData and $$tagTablePtr{PERMANENT}) {
+ if (defined $newData and not length $newData and ($$tagInfo{Permanent} or
+ ($$tagTablePtr{PERMANENT} and not defined $$tagInfo{Permanent})))
+ {
# do nothing if trying to delete tag from a PERMANENT table
$$et{CHANGED} = $oldChanged;
undef $newData;
@@ -1097,7 +1099,9 @@ sub WriteQuickTime($$$)
$$et{CUR_WRITE_GROUP} = $oldWriteGroup;
SetByteOrder('MM');
# add back header if necessary
- if ($start and defined $newData and length $newData) {
+ if ($start and defined $newData and (length $newData or
+ (defined $$tagInfo{Permanent} and not $$tagInfo{Permanent})))
+ {
$newData = substr($buff,0,$start) . $newData;
$$_[1] += $start foreach @chunkOffset;
}
diff --git a/lib/Image/ExifTool/Writer.pl b/lib/Image/ExifTool/Writer.pl
index 6bc7055d..b1621c33 100644
--- a/lib/Image/ExifTool/Writer.pl
+++ b/lib/Image/ExifTool/Writer.pl
@@ -574,6 +574,9 @@ sub SetNewValue($;$$%)
my $pre = $wantGroup ? $wantGroup . ':' : '';
$err = "Tag '$pre${origTag}' is not defined";
$err .= ' or has a bad language code' if $origTag =~ /-/;
+ if (not $pre and uc($origTag) eq 'TAG') {
+ $err .= " (specify a writable tag name, not '${origTag}' literally)"
+ }
} else {
$err = "Invalid tag name '${tag}'";
$err .= " (remove the leading '\$')" if $tag =~ /^\$/;
diff --git a/lib/Image/ExifTool/XMP.pm b/lib/Image/ExifTool/XMP.pm
index f608609c..e43be41b 100644
--- a/lib/Image/ExifTool/XMP.pm
+++ b/lib/Image/ExifTool/XMP.pm
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
require Exporter;
-$VERSION = '3.43';
+$VERSION = '3.44';
@ISA = qw(Exporter);
@EXPORT_OK = qw(EscapeXML UnescapeXML);
@@ -2017,6 +2017,11 @@ my %sPantryItem = (
Groups => { 2 => 'Location' },
Writable => 'integer',
PrintConv => {
+ OTHER => sub {
+ my ($val, $inv) = @_;
+ return undef unless $inv and $val =~ /^([-+0-9])/;
+ return($1 eq '-' ? 1 : 0);
+ },
0 => 'Above Sea Level',
1 => 'Below Sea Level',
},
diff --git a/lib/Image/ExifTool/XMP2.pl b/lib/Image/ExifTool/XMP2.pl
index ccab6369..2e32bf70 100644
--- a/lib/Image/ExifTool/XMP2.pl
+++ b/lib/Image/ExifTool/XMP2.pl
@@ -539,7 +539,8 @@ my %sImageRegion = ( # new in 1.5
NOTES => q{
This table contains tags defined by the IPTC Extension schema version 1.5.
The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
- the family 1 group name. (see L<http://www.iptc.org/IPTC4XMP/>)
+ the family 1 group name. (see
+ L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>)
},
AboutCvTerm => {
Struct => \%sCVTermDetails,