summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorexiftool <exiftool@users.sourceforge.net>2024-01-23 09:14:49 -0500
committerexiftool <exiftool@users.sourceforge.net>2024-01-23 09:14:49 -0500
commit2766977eee43be0f2ac602e7e42fb12c54b33e35 (patch)
treef1f80f1dee8231a840aaf3f05c8c41520c2a22a2
parentf7931c28a413acfbb326ba94af86d6e6845add9c (diff)
Update to 12.74
-rw-r--r--Changes27
-rw-r--r--META.json2
-rw-r--r--META.yml2
-rw-r--r--README4
-rwxr-xr-xexiftool89
-rw-r--r--html/ExifTool.html13
-rw-r--r--html/ExifTool.pdf556
-rw-r--r--html/Shift.pdf8
-rw-r--r--html/TagNames/Nikon.html4
-rw-r--r--html/TagNames/QuickTime.html24
-rw-r--r--html/TagNames/index.html4
-rw-r--r--html/exiftool_pod.html14
-rw-r--r--html/exiftool_pod.pdf1676
-rw-r--r--html/faq.html9
-rw-r--r--html/filename.html15
-rw-r--r--html/history.html30
-rw-r--r--html/index.html12
-rw-r--r--html/install.html22
-rw-r--r--html/models.html6
-rw-r--r--html/sample_images.html18
-rw-r--r--lib/File/RandomAccess.pm36
-rw-r--r--lib/File/RandomAccess.pod8
-rw-r--r--lib/Image/ExifTool.pm50
-rw-r--r--lib/Image/ExifTool.pod13
-rw-r--r--lib/Image/ExifTool/7Z.pm6
-rw-r--r--lib/Image/ExifTool/AFCP.pm4
-rw-r--r--lib/Image/ExifTool/BZZ.pm4
-rw-r--r--lib/Image/ExifTool/BuildTagLookup.pm10
-rw-r--r--lib/Image/ExifTool/Canon.pm6
-rw-r--r--lib/Image/ExifTool/CanonVRD.pm4
-rw-r--r--lib/Image/ExifTool/DICOM.pm4
-rw-r--r--lib/Image/ExifTool/DNG.pm8
-rw-r--r--lib/Image/ExifTool/Exif.pm4
-rw-r--r--lib/Image/ExifTool/FLIR.pm4
-rw-r--r--lib/Image/ExifTool/Fixup.pm6
-rw-r--r--lib/Image/ExifTool/FlashPix.pm6
-rw-r--r--lib/Image/ExifTool/FujiFilm.pm11
-rw-r--r--lib/Image/ExifTool/Geotag.pm6
-rw-r--r--lib/Image/ExifTool/HtmlDump.pm4
-rw-r--r--lib/Image/ExifTool/ID3.pm4
-rw-r--r--lib/Image/ExifTool/Import.pm10
-rw-r--r--lib/Image/ExifTool/JSON.pm4
-rw-r--r--lib/Image/ExifTool/Jpeg2000.pm4
-rw-r--r--lib/Image/ExifTool/MIE.pm6
-rw-r--r--lib/Image/ExifTool/MinoltaRaw.pm4
-rw-r--r--lib/Image/ExifTool/Nikon.pm4
-rw-r--r--lib/Image/ExifTool/NikonCustom.pm6
-rw-r--r--lib/Image/ExifTool/Ogg.pm4
-rw-r--r--lib/Image/ExifTool/PLIST.pm6
-rw-r--r--lib/Image/ExifTool/PanasonicRaw.pm6
-rw-r--r--lib/Image/ExifTool/PhaseOne.pm4
-rw-r--r--lib/Image/ExifTool/Photoshop.pm6
-rw-r--r--lib/Image/ExifTool/PostScript.pm4
-rw-r--r--lib/Image/ExifTool/QuickTime.pm147
-rw-r--r--lib/Image/ExifTool/QuickTimeStream.pl14
-rw-r--r--lib/Image/ExifTool/RSRC.pm4
-rw-r--r--lib/Image/ExifTool/Samsung.pm8
-rw-r--r--lib/Image/ExifTool/Shift.pl2
-rw-r--r--lib/Image/ExifTool/SigmaRaw.pm6
-rw-r--r--lib/Image/ExifTool/Sony.pm6
-rw-r--r--lib/Image/ExifTool/TagInfoXML.pm4
-rw-r--r--lib/Image/ExifTool/TagLookup.pm10
-rw-r--r--lib/Image/ExifTool/TagNames.pod6
-rw-r--r--lib/Image/ExifTool/WriteCanonRaw.pl2
-rw-r--r--lib/Image/ExifTool/WriteExif.pl30
-rw-r--r--lib/Image/ExifTool/WritePDF.pl2
-rw-r--r--lib/Image/ExifTool/WriteQuickTime.pl2
-rw-r--r--lib/Image/ExifTool/WriteXMP.pl6
-rw-r--r--lib/Image/ExifTool/Writer.pl108
-rw-r--r--lib/Image/ExifTool/ZIP.pm12
-rw-r--r--perl-Image-ExifTool.spec2
-rw-r--r--pp_build_exe.args8
-rw-r--r--t/ExifTool.t4
-rw-r--r--t/TestLib.pm2
-rw-r--r--t/XMP.t10
-rw-r--r--t/XMP_46.out1
-rwxr-xr-xwindows_exiftool76
77 files changed, 1705 insertions, 1568 deletions
diff --git a/Changes b/Changes
index 2b104650..d352c4ca 100644
--- a/Changes
+++ b/Changes
@@ -7,6 +7,30 @@ RSS feed: https://exiftool.org/rss.xml
Note: The most recent production release is Version 12.70. (Other versions are
considered development releases, and are not uploaded to MetaCPAN.)
+Jan. 23, 2024 - Version 12.74
+
+ - Added a couple of new Nikon lenses (thanks Chris)
+ - Added write support for a few new QuickTime Keys tags
+ - Decode ShutterCount for Canon EOS R5 (thanks John Moyer)
+ - Improved error messages in the case of file read errors
+ - Enhanced tag name strings (eg. -if option expressions) to allow values of
+ multiple matching tags to be concatenated when a group name of "All" is
+ specified
+ - Enhanced -p option to add -p- feature which avoids adding trailing newline
+ - Changed warning from "Shift results in negative time" to "Shift results in
+ date before 1970"
+ - Patched calculation of GPSDateTime for the timed metadata in Track3 of
+ Garmin videos so the API QuickTimeUTC option is no longer required
+ - Fixed conversion error when writing QuickTime:GoogleTrackDuration
+ - Fixed misidentification of non-TIFF-format files containing DNGVersion tag
+ - Fixed bug where Avoid-ed XMP structures could be created when writing
+ another same-named structure
+ - Internal Changes:
+ - Changed form of all new() calls to accommodate backward
+ incompatibilities in recent versions of Perl
+ - Changed order of InsertTagValues() arguments
+ - DateFmt() now returns value of formatted date/time string
+
Jan. 10, 2024 - Version 12.73
- Added write support for Leica XMP-xmpDSA tags
@@ -22,7 +46,8 @@ Jan. 10, 2024 - Version 12.73
decoding
- Fixed writing of date/time tags in XMP-xmpMM:Pantry structure
- API Changes:
- - Added LimitLongValues option
+ - Added LimitLongValues option to provide control over tags which
+ previously had a hard-coded length limit
Dec. 29, 2023 - Version 12.72
diff --git a/META.json b/META.json
index 3449e1b6..2908e6ad 100644
--- a/META.json
+++ b/META.json
@@ -50,5 +50,5 @@
}
},
"release_status" : "stable",
- "version" : "12.73"
+ "version" : "12.74"
}
diff --git a/META.yml b/META.yml
index 327f14ce..06926ecc 100644
--- a/META.yml
+++ b/META.yml
@@ -31,4 +31,4 @@ recommends:
Time::HiRes: 0
requires:
perl: 5.004
-version: 12.73
+version: 12.74
diff --git a/README b/README
index c8d780f7..05ec4e73 100644
--- a/README
+++ b/README
@@ -108,8 +108,8 @@ your home directory, then you would type the following commands in a
terminal window to extract and run ExifTool:
cd ~/Desktop
- gzip -dc Image-ExifTool-12.73.tar.gz | tar -xf -
- cd Image-ExifTool-12.73
+ gzip -dc Image-ExifTool-12.74.tar.gz | tar -xf -
+ cd Image-ExifTool-12.74
./exiftool t/images/ExifTool.jpg
Note: These commands extract meta information from one of the test images.
diff --git a/exiftool b/exiftool
index 03b50e5b..3b5404de 100755
--- a/exiftool
+++ b/exiftool
@@ -11,7 +11,7 @@ use strict;
use warnings;
require 5.004;
-my $version = '12.73';
+my $version = '12.74';
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
my $exePath;
@@ -70,7 +70,7 @@ sub PreserveTime();
sub AbsPath($);
sub MyConvertFileName($$);
sub SuggestedExtension($$$);
-sub LoadPrintFormat($);
+sub LoadPrintFormat($;$);
sub FilenameSPrintf($;$@);
sub NextUnusedFilename($;$);
sub CreateDirectory($);
@@ -271,7 +271,7 @@ my %optArgs = (
'-lang' => 0, # (optional arg; cannot begin with "-")
'-listitem' => 1,
'-o' => 1, '-out' => 1,
- '-p' => 1, '-printformat' => 1,
+ '-p' => 1, '-printformat' => 1, '-p-' => 1, '-printformat-' => 1,
'-P' => 0,
'-password' => 1,
'-require' => 1,
@@ -573,7 +573,7 @@ if ($^O eq 'MSWin32' and eval { require File::Glob }) {
$doGlob = 1;
}
-$mt = new Image::ExifTool; # create ExifTool object
+$mt = Image::ExifTool->new; # create ExifTool object
# don't extract duplicates by default unless set by UserDefined::Options
$mt->Options(Duplicates => 0) unless %Image::ExifTool::UserDefined::Options
@@ -1133,10 +1133,10 @@ for (;;) {
}
/^overwrite_original$/i and $overwriteOrig = 1, next;
/^overwrite_original_in_place$/i and $overwriteOrig = 2, next;
- if (/^p$/ or $a eq 'printformat') {
+ if (/^p(-?)$/ or /^printformat(-?)$/i) {
my $fmt = shift;
if ($pass) {
- LoadPrintFormat($fmt);
+ LoadPrintFormat($fmt, $1);
# load MWG module now if necessary
if (not $useMWG and grep /^mwg:/i, @requestTags) {
$useMWG = 1;
@@ -1145,7 +1145,7 @@ for (;;) {
}
} else {
# defer to next pass so the filename charset is available
- push @nextPass, '-p', $fmt;
+ push @nextPass, "-$_", $fmt;
}
next;
}
@@ -1792,7 +1792,7 @@ if (not $altEnc and $mt->Options('Lang') ne 'en' and eval { require Encode }) {
if (@fileOrder) {
my @allFiles;
ProcessFiles($mt, \@allFiles);
- my $sortTool = new Image::ExifTool;
+ my $sortTool = Image::ExifTool->new;
$sortTool->Options(FastScan => $fileOrderFast) if $fileOrderFast;
$sortTool->Options(PrintConv => $mt->Options('PrintConv'));
$sortTool->Options(Duplicates => 0);
@@ -2080,7 +2080,7 @@ sub GetImageInfo($$)
@foundTags = ('*', @tags) if @tags;
$info = $et->ImageInfo(Infile($pipe,$isWriting), \@foundTags, $opts);
foreach $condition (@condition) {
- my $cond = $et->InsertTagValues(\@foundTags, $condition, \%info);
+ my $cond = $et->InsertTagValues($condition, \@foundTags, \%info);
{
# set package so eval'd functions are in Image::ExifTool namespace
package Image::ExifTool;
@@ -2281,7 +2281,7 @@ sub GetImageInfo($$)
my @lines;
my $opt = $type eq 'IF' ? 'Silent' : 'Warn'; # silence "IF" warnings
foreach (@$prf) {
- my $line = $et->InsertTagValues(\@foundTags, $_, $opt, $grp, $cache);
+ my $line = $et->InsertTagValues($_, \@foundTags, $opt, $grp, $cache);
if ($type eq 'IF') {
$skipBody = 1 unless defined $line;
} elsif (defined $line) {
@@ -2714,7 +2714,7 @@ TAG: foreach $tag (@foundTags) {
} elsif ($fixLen == 1) {
$padLen -= length Encode::decode_utf8($desc);
} else {
- my $gcstr = eval { new Unicode::GCString(Encode::decode_utf8($desc)) };
+ my $gcstr = eval { Unicode::GCString->new(Encode::decode_utf8($desc)) };
if ($gcstr) {
$padLen -= $gcstr->columns;
} else {
@@ -3640,7 +3640,7 @@ sub Infile($;$)
if ($rafStdin) {
$rafStdin->Seek(0); # rewind
} elsif (open RAF_STDIN, '-') {
- $rafStdin = new File::RandomAccess(\*RAF_STDIN);
+ $rafStdin = File::RandomAccess->new(\*RAF_STDIN);
$rafStdin->BinMode();
}
return $rafStdin if $rafStdin;
@@ -4117,12 +4117,12 @@ sub SuggestedExtension($$$)
#------------------------------------------------------------------------------
# Load print format file
-# Inputs: 0) file name
+# Inputs: 0) file name, 1) flag to avoid adding newline to input argument
# - saves lines of file to %printFmt list
# - adds tag names to @tags list
-sub LoadPrintFormat($)
+sub LoadPrintFormat($;$)
{
- my $arg = shift;
+ my ($arg, $noNL) = @_;
if (not defined $arg) {
Error "Must specify file or expression for -p option\n";
} elsif ($arg !~ /\n/ and -f $arg and $mt->Open(\*FMT_FILE, $arg)) {
@@ -4131,7 +4131,8 @@ sub LoadPrintFormat($)
}
close(FMT_FILE);
} else {
- AddPrintFormat($arg . "\n");
+ $arg .= "\n" unless $noNL;
+ AddPrintFormat($arg);
}
}
@@ -4295,7 +4296,7 @@ sub CreateDirectory($)
return 0;
}
unless ($k32CreateDir) {
- $k32CreateDir = new Win32::API('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
+ $k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
}
$success = $k32CreateDir->Call($d2, 0) if $k32CreateDir;
} else {
@@ -4752,7 +4753,7 @@ L<Input-output text formatting|/Input-output text formatting>
-lang [LANG] Set current language
-listItem INDEX Extract specific item from a list
-n (--printConv) No print conversion
- -p FMTFILE (-printFormat) Print output in specified format
+ -p[-] STR (-printFormat) Print output in specified format
-php Export tags as a PHP Array
-s[NUM] (-short) Short output format (-s for tag names)
-S (-veryShort) Very short output format
@@ -5561,30 +5562,31 @@ when writing. For example, the following commands all have the same effect:
> exiftool -Orientation=6 -n a.jpg
> exiftool -Orientation#=6 a.jpg
-=item B<-p> I<FMTFILE> or I<STR> (B<-printFormat>)
+=item B<-p>[-] I<STR> or I<FMTFILE> (B<-printFormat>)
-Print output in the format specified by the given file or string. The
+Print output in the format specified by the given string or file. The
argument is interpreted as a string unless a file of that name exists, in
which case the string is loaded from the contents of the file. Tag names in
-the format file or string begin with a C<$> symbol and may contain leading
+the format string or file begin with a C<$> symbol and may contain leading
group names and/or a trailing C<#> (to disable print conversion). Case is
not significant. Braces C<{}> may be used around the tag name to separate
it from subsequent text (and must be used if subsequent text begins with an
alphanumeric character, hyphen, underline, colon or number sign). Use C<$$>
-to represent a C<$> symbol, and C<$/> for a newline.
-
-Multiple B<-p> options may be used, each contributing a line (or more) of
-text to the output. Lines beginning with C<#[HEAD]> and C<#[TAIL]> are
-output before the first processed file and after the last processed file
-respectively. Lines beginning with C<#[SECT]> and C<#[ENDS]> are output
-before and after each section of files. A section is defined as a group of
-consecutive files with the same section header (eg. files are grouped by
-directory if C<#[SECT]> contains C<$directory>). Lines beginning with
-C<#[BODY]> and lines not beginning with C<#> are output for each processed
-file. Lines beginning with C<#[IF]> are not output, but all BODY lines are
-skipped if any tag on an IF line doesn't exist. Other lines beginning with
-C<#> are ignored. (To output a line beginning with C<#>, use C<#[BODY]#>.)
-For example, this format file:
+to represent a C<$> symbol, and C<$/> for a newline. When the string
+argument is used (ie. I<STR>), a newline is added to the end of the string
+unless B<-p-> is specified.
+
+Multiple B<-p> options may be used. Lines beginning with C<#[HEAD]> and
+C<#[TAIL]> are output before the first processed file and after the last
+processed file respectively. Lines beginning with C<#[SECT]> and C<#[ENDS]>
+are output before and after each section of files. A section is defined as
+a group of consecutive files with the same section header (eg. files are
+grouped by directory if C<#[SECT]> contains C<$directory>). Lines beginning
+with C<#[BODY]> and lines not beginning with C<#> are output for each
+processed file. Lines beginning with C<#[IF]> are not output, but all BODY
+lines are skipped if any tag on an IF line doesn't exist. Other lines
+beginning with C<#> are ignored. (To output a line beginning with C<#>, use
+C<#[BODY]#>.) For example, this format file:
# this is a comment line
#[HEAD]-- Generated by ExifTool $exifToolVersion --
@@ -5598,16 +5600,21 @@ with this command:
produces output like this:
- -- Generated by ExifTool 12.73 --
+ -- Generated by ExifTool 12.74 --
File: a.jpg - 2003:10:31 15:44:19
(f/5.6, 1/60s, ISO 100)
File: b.jpg - 2006:05:23 11:57:38
(f/8.0, 1/13s, ISO 100)
-- end --
-The values of List-type tags with multiple items and Shortcut tags
-representing multiple tags are joined according the B<-sep> option setting
-when interpolated in the string.
+The values of List-type tags with multiple items, Shortcut tags representing
+multiple tags, and matching tags when the C<All> group is specified are
+joined according the B<-sep> option setting when interpolated in the string.
+(Note that when C<All> is used as a group name, dupicate tags are included
+regardless of the Duplicates option setting.) When C<All> is used as a tag
+name, a value of 1 is returned if any tag exists in the specified group, or
+0 otherwise (unless the C<All> group is also specified, in which case the
+values of all matching tags are joined).
When B<-ee> (B<-extractEmbedded>) is combined with B<-p>, embedded documents
are effectively processed as separate input files.
@@ -6550,7 +6557,9 @@ set to undef if C<=> is used, or an empty string with C<^=>. If I<OPT> is
not specified a list of available options is returned. The option name is
not case senstive, but the option values are. See
L<Image::ExifTool Options|Image::ExifTool/Options> for option details. This
-overrides API options set via the config file.
+overrides API options set via the config file. Note that the exiftool app
+sets some API options internally, and attempts to change these via the
+command line will have no effect.
=item B<-common_args>
diff --git a/html/ExifTool.html b/html/ExifTool.html
index e4a44dbf..1690157d 100644
--- a/html/ExifTool.html
+++ b/html/ExifTool.html
@@ -558,7 +558,8 @@ effect as a value of 0 for options with numerical values.</p>
format (similar to a DateFormat of <code>"%Y:%m:%d %H:%M:%S"</code>).</td>
<td align=center>undef</td></tr>
<tr id="Duplicates"><td>Duplicates</td><td>Flag to return values from
- tags with duplicate names when extracting information.</td>
+ tags with duplicate names when extracting information. Forced to 1
+ when copying tags with <a href="#SetNewValuesFromFile">SetNewValuesFromFile</a>.</td>
<td align=center>0 or 1</td><td align=center>1</td></tr>
<tr id="Escape"><td>Escape</td>
<td>Escape special characters in extracted values for
@@ -746,11 +747,11 @@ effect as a value of 0 for options with numerical values.</p>
<td align=center>'en'</td></tr>
<tr id="LargeFileSupport"><td>LargeFileSupport</td><td>Flag to indicate that 64-bit file offsets are supported on this system.</td>
<td align=center>0 or 1</td><td align=center>undef</td></tr>
-<tr id="LimitLongValues"><td>LimitLongValues</td><td>When extracting some values
- that may be very long, the PrintConv values are length-limited and the value is
- truncated with an elipsis ("[...]") if it exceeds a specified length. This
- option specifies the length limit for these tags. A setting of 4 or less
- disables the limit (because the elipsis string is longer than this).</td>
+<tr id="LimitLongValues"><td>LimitLongValues</td><td>When extracting some values for
+ some specific tags (usually Unknown tags), the PrintConv values are length-limited
+ and the value is truncated with an ellipsis ("[...]") if it exceeds a specified
+ length. This option specifies the length limit for these tags. A setting of 4 or
+ less disables the limit (because the ellipsis string is longer than this).</td>
<td align=center>Any integer</td><td align=center>60</td></tr>
<!-- deprecated in ExifTool 10.54; use "ListJoin" instead
<tr id="List"><td>List</td><td>Flag to extract lists of PrintConv values into arrays instead of combining
diff --git a/html/ExifTool.pdf b/html/ExifTool.pdf
index f5d8b643..60815898 100644
--- a/html/ExifTool.pdf
+++ b/html/ExifTool.pdf
@@ -12,7 +12,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 1)Tj
+( -- Image::ExifTool 12.74 -- 1)Tj
/TT4 1 Tf
0 -1.6333 TD
(EXIFTOOL\(1\) User Contributed Perl Documentation EXIFTOOL\(1\))Tj
@@ -189,7 +189,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 2)Tj
+( -- Image::ExifTool 12.74 -- 2)Tj
/TT4 1 Tf
0 -1.6333 TD
( ARQ r/w | EXV r/w/c | LRV r/w | PAGES r | SVG r)Tj
@@ -370,7 +370,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 3)Tj
+( -- Image::ExifTool 12.74 -- 3)Tj
/TT4 1 Tf
0 -1.6333 TD
(E)Tj
@@ -619,7 +619,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 4)Tj
+( -- Image::ExifTool 12.74 -- 4)Tj
/TT4 1 Tf
0 -1.6333 TD
( Below is an explanation of how the "ImageInfo" function arguments)Tj
@@ -770,7 +770,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 5)Tj
+( -- Image::ExifTool 12.74 -- 5)Tj
/TT4 1 Tf
0 -2.7333 TD
( There will be 1:1 correspondence between the requested tags and)Tj
@@ -933,7 +933,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 6)Tj
+( -- Image::ExifTool 12.74 -- 6)Tj
/TT4 1 Tf
0 -1.6333 TD
( })Tj
@@ -1124,7 +1124,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 7)Tj
+( -- Image::ExifTool 12.74 -- 7)Tj
/TT4 1 Tf
0 -1.6333 TD
( Flag to extract the value data for all binary tags. Tag values)Tj
@@ -1277,7 +1277,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 8)Tj
+( -- Image::ExifTool 12.74 -- 8)Tj
/TT4 1 Tf
0 -1.6333 TD
( functions. When set in Windows, this triggers use of Windows)Tj
@@ -1414,7 +1414,7 @@ endobj
endobj
30 0 obj
<<
-/Length 4748
+/Length 4745
>>
stream
BT
@@ -1424,7 +1424,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 9)Tj
+( -- Image::ExifTool 12.74 -- 9)Tj
/TT4 1 Tf
0 -1.6333 TD
( hemisphere is known, a reference direction \(N, S, E or W\) is)Tj
@@ -1479,7 +1479,9 @@ T*
0 -1.1 TD
( Flag to return values from tags with duplicate names when)Tj
T*
-( extracting information. Default is 1.)Tj
+( extracting information. Default is 1. Forced to 1 when)Tj
+T*
+( copying tags with "SetNewValuesFromFile".)Tj
0 -2.2 TD
( Escape)Tj
0 -1.1 TD
@@ -1546,8 +1548,6 @@ T*
( after the first Cluster in MKV files, timed metadata in videos,)Tj
T*
( all frames of a multipart EXR image, and the resource fork of)Tj
-T*
-( Mac OS files. A setting of 2 also causes the H264 video stream)Tj
ET
endstream
endobj
@@ -1565,7 +1565,7 @@ endobj
endobj
33 0 obj
<<
-/Length 5079
+/Length 5125
>>
stream
BT
@@ -1575,11 +1575,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 10)Tj
+( -- Image::ExifTool 12.74 -- 10)Tj
/TT4 1 Tf
0 -1.6333 TD
-( in MP4 files to be parsed until the first SEI message is)Tj
+( Mac OS files. A setting of 2 also causes the H264 video stream)Tj
0 -1.1 TD
+( in MP4 files to be parsed until the first SEI message is)Tj
+T*
( decoded, or 3 to parse the entire H264 stream in MP4 videos and)Tj
T*
( the entire M2TS file to look for any unlisted program)Tj
@@ -1703,8 +1705,6 @@ T*
( nearest fix instead \(provided it is within GeoMaxExtSecs,)Tj
T*
( otherwise geotagging fails\). Default is 1800.)Tj
-0 -2.2 TD
-( GeoMaxExtSecs)Tj
ET
endstream
endobj
@@ -1722,7 +1722,7 @@ endobj
endobj
36 0 obj
<<
-/Length 4616
+/Length 4589
>>
stream
BT
@@ -1732,11 +1732,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 11)Tj
+( -- Image::ExifTool 12.74 -- 11)Tj
/TT4 1 Tf
0 -1.6333 TD
-( Maximum extrapolation time in seconds for geotagging.)Tj
+( GeoMaxExtSecs)Tj
0 -1.1 TD
+( Maximum extrapolation time in seconds for geotagging.)Tj
+T*
( Geotagging fails if the Geotime value lies outside a GPS track)Tj
T*
( by a number of seconds greater than this. Otherwise, for an)Tj
@@ -1894,8 +1896,6 @@ T*
( errors and warnings are denoted by "[minor]" at the start of)Tj
T*
( the message, or "[Minor]" \(with a capital "M"\) for warnings)Tj
-T*
-( that affect processing when ignored.)Tj
ET
endstream
endobj
@@ -1913,7 +1913,7 @@ endobj
endobj
41 0 obj
<<
-/Length 4395
+/Length 4442
>>
stream
BT
@@ -1923,9 +1923,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 12)Tj
+( -- Image::ExifTool 12.74 -- 12)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( that affect processing when ignored.)Tj
+0 -2.2 TD
( IgnoreTags)Tj
0 -1.1 TD
( List of tag names to ignore when reading. This may help in)Tj
@@ -1972,15 +1974,15 @@ T*
0 -2.2 TD
( LimitLongValues)Tj
0 -1.1 TD
-( When extracting some values that may be very long, the)Tj
+( When extracting values for some specific tags \(usually Unknown)Tj
T*
-( PrintConv values are length-limited and the value is truncated)Tj
+( tags\), the PrintConv values are length-limited and the value is)Tj
T*
-( with an elipsis \("[...]"\) if it exceeds a specified length.)Tj
+( truncated with an ellipsis \("[...]"\) if it exceeds a specified)Tj
T*
-( This option specifies the length limit for these tags. A)Tj
+( length. This option specifies the length limit for these tags.)Tj
T*
-( setting of 4 or less disables the limit \(because the elipsis)Tj
+( A setting of 4 or less disables the limit \(because the ellipsis)Tj
T*
( string is longer than this\). Default is 60.)Tj
0 -2.2 TD
@@ -2041,8 +2043,6 @@ T*
( Flag to extract the OS X metadata item tags \(see the "mdls" man)Tj
T*
( page and "MacOS MDItem Tags" in Image::ExifTool::TagNames for)Tj
-T*
-( more information\).)Tj
ET
endstream
endobj
@@ -2060,7 +2060,7 @@ endobj
endobj
44 0 obj
<<
-/Length 4370
+/Length 4339
>>
stream
BT
@@ -2070,9 +2070,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 13)Tj
+( -- Image::ExifTool 12.74 -- 13)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( more information\).)Tj
+0 -2.2 TD
( MissingTagValue)Tj
0 -1.1 TD
( Value for missing tags in tag name expressions \(or tags where)Tj
@@ -2188,8 +2190,6 @@ T*
( not convert these times \(except for Canon CR3 files, which)Tj
T*
( always use UTC times\). This option also disables the)Tj
-T*
-( autodetection of incorrect time-zero offsets in QuickTime)Tj
ET
endstream
endobj
@@ -2207,7 +2207,7 @@ endobj
endobj
47 0 obj
<<
-/Length 4413
+/Length 4408
>>
stream
BT
@@ -2217,11 +2217,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 14)Tj
+( -- Image::ExifTool 12.74 -- 14)Tj
/TT4 1 Tf
0 -1.6333 TD
-( date/time values, and enforces a time zero of 1904 as per the)Tj
+( autodetection of incorrect time-zero offsets in QuickTime)Tj
0 -1.1 TD
+( date/time values, and enforces a time zero of 1904 as per the)Tj
+T*
( QuickTime specification.)Tj
0 -2.2 TD
( RequestAll)Tj
@@ -2333,8 +2335,6 @@ T*
( 1 - Return undef if date/time value can't be converted)Tj
0 -2.2 TD
( When set to 1 while writing a PrintConv date/time value with)Tj
-0 -1.1 TD
-( the DateFormat option set, the value is written only if)Tj
ET
endstream
endobj
@@ -2352,7 +2352,7 @@ endobj
endobj
50 0 obj
<<
-/Length 4152
+/Length 4169
>>
stream
BT
@@ -2362,11 +2362,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 15)Tj
+( -- Image::ExifTool 12.74 -- 15)Tj
/TT4 1 Tf
0 -1.6333 TD
-( POSIX::strptime or Time::Piece is available and can)Tj
+( the DateFormat option set, the value is written only if)Tj
0 -1.1 TD
+( POSIX::strptime or Time::Piece is available and can)Tj
+T*
( successfully convert the value.)Tj
0 -2.2 TD
( For PNG CreationTime, a setting of 1 has the additional effect)Tj
@@ -2486,8 +2488,6 @@ T*
( User-defined parameters may be accessed in tag name expressions)Tj
0 -1.1 TD
( by prefixing the parameter name with a dollar sign just like)Tj
-T*
-( normal tags, or via the API by calling)Tj
ET
endstream
endobj
@@ -2505,7 +2505,7 @@ endobj
endobj
53 0 obj
<<
-/Length 4181
+/Length 4208
>>
stream
BT
@@ -2515,11 +2515,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 16)Tj
+( -- Image::ExifTool 12.74 -- 16)Tj
/TT4 1 Tf
0 -1.6333 TD
-( "Options\('UserParam','PARAM'\)". Appending a hash tag \("#"\) to)Tj
+( normal tags, or via the API by calling)Tj
0 -1.1 TD
+( "Options\('UserParam','PARAM'\)". Appending a hash tag \("#"\) to)Tj
+T*
( the parameter name also causes the parameter to be extracted as)Tj
T*
( a normal tag \(in the UserParam group\). If called without)Tj
@@ -2653,8 +2655,6 @@ T*
( 0\) ExifTool object reference)Tj
0 -2.2 TD
( Return Values:)Tj
-0 -1.1 TD
-( \(none\))Tj
ET
endstream
endobj
@@ -2672,7 +2672,7 @@ endobj
endobj
56 0 obj
<<
-/Length 4339
+/Length 4373
>>
stream
BT
@@ -2682,9 +2682,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 17)Tj
+( -- Image::ExifTool 12.74 -- 17)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( \(none\))Tj
+0 -2.2 TD
( E)Tj
1.8 0 TD
(Ex)Tj
@@ -2871,9 +2873,9 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 18)Tj
+( -- Image::ExifTool 12.74 -- 18)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
( ExifTool queues all new values that are assigned via calls to)Tj
0 -1.1 TD
( "SetNewValue", then applies them to any number of files through one or)Tj
@@ -3008,9 +3010,9 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 19)Tj
+( -- Image::ExifTool 12.74 -- 19)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
( The following ExifTool options are effective in the call to)Tj
0 -1.1 TD
( "WriteInfo":)Tj
@@ -3201,7 +3203,7 @@ endobj
endobj
65 0 obj
<<
-/Length 4242
+/Length 4156
>>
stream
BT
@@ -3211,9 +3213,9 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 20)Tj
+( -- Image::ExifTool 12.74 -- 20)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
( G)Tj
1.8 0 TD
(Ge)Tj
@@ -3343,8 +3345,6 @@ T*
( context. \(Unless 'Both' values are requested, in which case two)Tj
T*
( list references are returned, regardless of context.\) Values may)Tj
-T*
-( also be scalar references to binary data, or hash references if the)Tj
ET
endstream
endobj
@@ -3362,7 +3362,7 @@ endobj
endobj
68 0 obj
<<
-/Length 4348
+/Length 4352
>>
stream
BT
@@ -3372,9 +3372,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 21)Tj
+( -- Image::ExifTool 12.74 -- 21)Tj
/TT4 1 Tf
0 -1.6333 TD
+( also be scalar references to binary data, or hash references if the)Tj
+0 -1.1 TD
( "Struct" option is set.)Tj
0 -2.2 TD
( Note: It is possible for "GetValue" to return an undefined)Tj
@@ -3502,8 +3504,6 @@ T*
( # delete all but EXIF tags)Tj
0 -1.1 TD
( $exifTool->SetNewValue\('*'\); # delete all...)Tj
-T*
-( $exifTool->SetNewValue\('EXIF:*', undef, Replace => 2\); # ...but EXIF)Tj
ET
endstream
endobj
@@ -3521,7 +3521,7 @@ endobj
endobj
72 0 obj
<<
-/Length 4461
+/Length 4557
>>
stream
BT
@@ -3531,9 +3531,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 22)Tj
+( -- Image::ExifTool 12.74 -- 22)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( $exifTool->SetNewValue\('EXIF:*', undef, Replace => 2\); # ...but EXIF)Tj
+0 -2.2 TD
( # write structured information as a HASH reference)Tj
0 -1.1 TD
( $exifTool->SetNewValue\('XMP:Flash' => {)Tj
@@ -3666,7 +3668,7 @@ endobj
endobj
75 0 obj
<<
-/Length 4804
+/Length 4726
>>
stream
BT
@@ -3676,9 +3678,9 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 23)Tj
+( -- Image::ExifTool 12.74 -- 23)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
( Group)Tj
0 -1.1 TD
( Specifies group name where tag should be written. This option)Tj
@@ -3840,8 +3842,6 @@ T*
( information is not deleted by default because doing so may affect)Tj
T*
( the appearance of the image. However, this information may be)Tj
-T*
-( deleted by specifying it explicitly, either by group \(with)Tj
ET
endstream
endobj
@@ -3859,7 +3859,7 @@ endobj
endobj
78 0 obj
<<
-/Length 4222
+/Length 4239
>>
stream
BT
@@ -3869,9 +3869,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 24)Tj
+( -- Image::ExifTool 12.74 -- 24)Tj
/TT4 1 Tf
0 -1.6333 TD
+( deleted by specifying it explicitly, either by group \(with)Tj
+0 -1.1 TD
( 'Adobe:*'\) or as a block \(with 'Adobe'\).)Tj
0 -2.2 TD
( The following ExifTool options are effective in the call to)Tj
@@ -4033,8 +4035,6 @@ T*
( # copy all tags with names starting with "gps" \(note: this is)Tj
0 -1.1 TD
( # different than "gps:*" because it will also copy XMP GPS tags\))Tj
-T*
-( $exifTool->SetNewValuesFromFile\($file, 'gps*'\);)Tj
ET
endstream
endobj
@@ -4052,7 +4052,7 @@ endobj
endobj
81 0 obj
<<
-/Length 5044
+/Length 5119
>>
stream
BT
@@ -4062,9 +4062,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 25)Tj
+( -- Image::ExifTool 12.74 -- 25)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( $exifTool->SetNewValuesFromFile\($file, 'gps*'\);)Tj
+0 -2.2 TD
( # set FileName from Model, translating questionable characters)Tj
0 -1.1 TD
( $exifTool->SetNewValuesFromFile\($file,)Tj
@@ -4203,7 +4205,7 @@ endobj
endobj
84 0 obj
<<
-/Length 4379
+/Length 4350
>>
stream
BT
@@ -4213,9 +4215,9 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 26)Tj
+( -- Image::ExifTool 12.74 -- 26)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
( - The Group option is set for tags where a group name is given.)Tj
0 -2.2 TD
( - The Protected flag is set to 1 for individually specified tags.)Tj
@@ -4403,8 +4405,6 @@ T*
( was last called. May be called repeatedly after a single call to)Tj
T*
( "SaveNewValues". See "SaveNewValues" above for an example.)Tj
-0 -2.2 TD
-( Inputs:)Tj
ET
endstream
endobj
@@ -4422,7 +4422,7 @@ endobj
endobj
87 0 obj
<<
-/Length 4066
+/Length 4040
>>
stream
BT
@@ -4432,9 +4432,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 27)Tj
+( -- Image::ExifTool 12.74 -- 27)Tj
/TT4 1 Tf
0 -1.6333 TD
+( Inputs:)Tj
+0 -1.1 TD
( 0\) ExifTool object reference)Tj
0 -2.2 TD
( Return Value:)Tj
@@ -4622,8 +4624,6 @@ T*
( $result = $exifTool->SetFileName\($file, $newName\);)Tj
0 -2.2 TD
( Inputs:)Tj
-0 -1.1 TD
-( 0\) ExifTool object reference)Tj
ET
endstream
endobj
@@ -4641,7 +4641,7 @@ endobj
endobj
90 0 obj
<<
-/Length 3787
+/Length 3744
>>
stream
BT
@@ -4651,11 +4651,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 28)Tj
+( -- Image::ExifTool 12.74 -- 28)Tj
/TT4 1 Tf
-0 -2.7333 TD
-( 1\) Current file name)Tj
+0 -1.6333 TD
+( 0\) ExifTool object reference)Tj
0 -2.2 TD
+( 1\) Current file name)Tj
+T*
( 2\) [optional] New file name)Tj
T*
( 3\) [optional] 'HardLink' or 'SymLink' to create a hard or symbolic)Tj
@@ -4817,8 +4819,6 @@ T*
( 1\) Tag key)Tj
T*
( Return Values:)Tj
-0 -1.1 TD
-( In scalar context, returns the tag ID or '' if there is no ID for)Tj
ET
endstream
endobj
@@ -4836,7 +4836,7 @@ endobj
endobj
93 0 obj
<<
-/Length 4238
+/Length 4236
>>
stream
BT
@@ -4846,11 +4846,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 29)Tj
+( -- Image::ExifTool 12.74 -- 29)Tj
/TT4 1 Tf
0 -1.6333 TD
-( this tag. In list context, returns the tag ID \(or ''\) and the)Tj
+( In scalar context, returns the tag ID or '' if there is no ID for)Tj
0 -1.1 TD
+( this tag. In list context, returns the tag ID \(or ''\) and the)Tj
+T*
( language code \(or undef\).)Tj
0 -2.2 TD
( G)Tj
@@ -4998,8 +5000,6 @@ T*
( group is separated based on the XMP namespace prefix. Note that)Tj
T*
( only common XMP namespaces are listed in the GetAllGroups)Tj
-T*
-( documentation, but additional namespaces may be present in some XMP)Tj
ET
endstream
endobj
@@ -5017,7 +5017,7 @@ endobj
endobj
96 0 obj
<<
-/Length 4529
+/Length 4615
>>
stream
BT
@@ -5027,11 +5027,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 30)Tj
+( -- Image::ExifTool 12.74 -- 30)Tj
/TT4 1 Tf
0 -1.6333 TD
-( data. Also note that the 'XMP-xmp...' group names may appear in)Tj
+( documentation, but additional namespaces may be present in some XMP)Tj
0 -1.1 TD
+( data. Also note that the 'XMP-xmp...' group names may appear in)Tj
+T*
( the older form 'XMP-xap...' since these names evolved as the XMP)Tj
T*
( standard was developed. The ICC_Profile group is broken down to)Tj
@@ -5184,9 +5186,9 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 31)Tj
+( -- Image::ExifTool 12.74 -- 31)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
( B)Tj
1.8 0 TD
(Bu)Tj
@@ -5469,7 +5471,7 @@ endobj
endobj
103 0 obj
<<
-/Length 5002
+/Length 4922
>>
stream
BT
@@ -5479,9 +5481,9 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 32)Tj
+( -- Image::ExifTool 12.74 -- 32)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
( G)Tj
1.8 0 TD
(Ge)Tj
@@ -5713,8 +5715,6 @@ T*
( equiv, ICC-chrm, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-)Tj
T*
( view, ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2,)Tj
-T*
-( ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ISO, ITC, InfiRay,)Tj
ET
endstream
endobj
@@ -5732,7 +5732,7 @@ endobj
endobj
106 0 obj
<<
-/Length 4901
+/Length 4905
>>
stream
BT
@@ -5742,11 +5742,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 33)Tj
+( -- Image::ExifTool 12.74 -- 33)Tj
/TT4 1 Tf
0 -1.6333 TD
-( Insta360, InteropIFD, ItemList, JFIF, JFXX, JPEG, JPEG-HDR, JPS,)Tj
+( ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ISO, ITC, InfiRay,)Tj
0 -1.1 TD
+( Insta360, InteropIFD, ItemList, JFIF, JFXX, JPEG, JPEG-HDR, JPS,)Tj
+T*
( JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys, Kodak, KodakBordersIFD,)Tj
T*
( KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf, LeafSubIFD,)Tj
@@ -5908,8 +5910,6 @@ T*
(])Tj
-15.6 -1.1 TD
( Get list of all deletable group names.)Tj
-0 -2.2 TD
-( @delGroups = Image::ExifTool::GetDeleteGroups\(\);)Tj
ET
endstream
endobj
@@ -5927,7 +5927,7 @@ endobj
endobj
109 0 obj
<<
-/Length 4607
+/Length 4647
>>
stream
BT
@@ -5937,9 +5937,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 34)Tj
+( -- Image::ExifTool 12.74 -- 34)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( @delGroups = Image::ExifTool::GetDeleteGroups\(\);)Tj
+0 -2.2 TD
( Inputs:)Tj
0 -1.1 TD
( None.)Tj
@@ -6117,8 +6119,6 @@ T*
( Return Value:)Tj
0 -1.1 TD
( True if ExifTool supports writing files of this type \(based on the)Tj
-T*
-( file extension\).)Tj
ET
endstream
endobj
@@ -6136,7 +6136,7 @@ endobj
endobj
112 0 obj
<<
-/Length 4829
+/Length 4786
>>
stream
BT
@@ -6146,9 +6146,11 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 35)Tj
+( -- Image::ExifTool 12.74 -- 35)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( file extension\).)Tj
+0 -2.2 TD
( C)Tj
1.8 0 TD
(Ca)Tj
@@ -6380,8 +6382,6 @@ T*
( empty string. Setting "CharsetFileName" to any other value causes)Tj
T*
( file names to be converted from the specified encoding to one)Tj
-T*
-( appropriate for the system. In Windows this also has the effect of)Tj
ET
endstream
endobj
@@ -6399,7 +6399,7 @@ endobj
endobj
115 0 obj
<<
-/Length 5460
+/Length 5492
>>
stream
BT
@@ -6409,11 +6409,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 36)Tj
+( -- Image::ExifTool 12.74 -- 36)Tj
/TT4 1 Tf
0 -1.6333 TD
-( activating Unicode filename support via the special Windows wide-)Tj
+( appropriate for the system. In Windows this also has the effect of)Tj
0 -1.1 TD
+( activating Unicode filename support via the special Windows wide-)Tj
+T*
( character i/o routines if Win32API::File is available.)Tj
0 -2.2 TD
( Internal Character Sets:)Tj
@@ -6591,8 +6593,6 @@ T*
( desired value of CodedCharacterSet. For example, the following command)Tj
T*
( changes the internal IPTC encoding to UTF-8 \(from Windows Latin1 unless)Tj
-T*
-( CodedCharacterSet was already 'UTF8'\):)Tj
ET
endstream
endobj
@@ -6610,7 +6610,7 @@ endobj
endobj
118 0 obj
<<
-/Length 4502
+/Length 4394
>>
stream
BT
@@ -6620,11 +6620,13 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 37)Tj
+( -- Image::ExifTool 12.74 -- 37)Tj
/TT4 1 Tf
-0 -2.7333 TD
-( exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg)Tj
+0 -1.6333 TD
+( CodedCharacterSet was already 'UTF8'\):)Tj
0 -2.2 TD
+( exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg)Tj
+T*
( or from Windows Latin2 \(cp1250\) to UTF-8:)Tj
T*
( exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 \\)Tj
@@ -6776,26 +6778,6 @@ T*
( only if the string contains special characters, otherwise)Tj
T*
( PDFDocEncoding is used.)Tj
-0 -2.2 TD
-( P)Tj
-1.8 0 TD
-(Ph)Tj
-0.6 0 TD
-(ho)Tj
-0.6 0 TD
-(ot)Tj
-0.6 0 TD
-(to)Tj
-0.6 0 TD
-(os)Tj
-0.6 0 TD
-(sh)Tj
-0.6 0 TD
-(ho)Tj
-0.6 0 TD
-(op)Tj
-0.6 0 TD
-(p)Tj
ET
endstream
endobj
@@ -6813,7 +6795,7 @@ endobj
endobj
121 0 obj
<<
-/Length 5590
+/Length 5748
>>
stream
BT
@@ -6823,11 +6805,31 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- Image::ExifTool 12.73 -- 38)Tj
+( -- Image::ExifTool 12.74 -- 38)Tj
/TT4 1 Tf
0 -1.6333 TD
+( P)Tj
+1.8 0 TD
+(Ph)Tj
+0.6 0 TD
+(ho)Tj
+0.6 0 TD
+(ot)Tj
+0.6 0 TD
+(to)Tj
+0.6 0 TD
+(os)Tj
+0.6 0 TD
+(sh)Tj
+0.6 0 TD
+(ho)Tj
+0.6 0 TD
+(op)Tj
+0.6 0 TD
+(p)Tj
+-6.6 -1.1 TD
( Some Photoshop resource names are stored as Pascal strings with unknown)Tj
-0 -1.1 TD
+T*
( encoding. By default, ExifTool assumes MacRoman encoding and converts)Tj
T*
( this to UTF-8, but the internal and external character sets may be)Tj
@@ -7246,7 +7248,7 @@ T*
0.6 0 TD
(G\(3pm\))Tj
-27 -4.4 TD
-(perl v5.18.4 2024-01-10 EXIFTOOL\(1\))Tj
+(perl v5.18.4 2024-01-22 EXIFTOOL\(1\))Tj
ET
endstream
endobj
@@ -7698,8 +7700,8 @@ endobj
endobj
127 0 obj
<<
-/CreationDate (D:20240110140143-05'00')
-/ModDate (D:20240110140143-05'00')
+/CreationDate (D:20240123091135-05'00')
+/ModDate (D:20240123091135-05'00')
/Producer (Apple pstopdf)
>>
endobj
@@ -7713,141 +7715,141 @@ endobj
xref
0 129
0000000000 65535 f
-0000180210 00000 n
+0000180332 00000 n
0000000016 00000 n
0000004115 00000 n
-0000179211 00000 n
-0000179612 00000 n
-0000178676 00000 n
-0000183488 00000 n
-0000180290 00000 n
+0000179333 00000 n
+0000179734 00000 n
+0000178798 00000 n
+0000183610 00000 n
+0000180412 00000 n
0000004221 00000 n
0000009511 00000 n
-0000180371 00000 n
+0000180493 00000 n
0000009618 00000 n
0000014458 00000 n
-0000180454 00000 n
+0000180576 00000 n
0000014565 00000 n
0000019390 00000 n
-0000180537 00000 n
+0000180659 00000 n
0000019497 00000 n
0000024100 00000 n
-0000180620 00000 n
+0000180742 00000 n
0000024207 00000 n
0000028306 00000 n
-0000180703 00000 n
+0000180825 00000 n
0000028413 00000 n
0000033192 00000 n
-0000180786 00000 n
+0000180908 00000 n
0000033299 00000 n
0000037850 00000 n
-0000180869 00000 n
+0000180991 00000 n
0000037957 00000 n
-0000042758 00000 n
-0000180952 00000 n
-0000042865 00000 n
-0000047997 00000 n
-0000181035 00000 n
-0000048104 00000 n
-0000052773 00000 n
-0000184030 00000 n
-0000183623 00000 n
-0000181119 00000 n
-0000052880 00000 n
-0000057328 00000 n
-0000181203 00000 n
-0000057435 00000 n
-0000061858 00000 n
-0000181287 00000 n
-0000061965 00000 n
-0000066431 00000 n
-0000181371 00000 n
-0000066538 00000 n
-0000070743 00000 n
-0000181455 00000 n
-0000070850 00000 n
-0000075084 00000 n
-0000181539 00000 n
-0000075191 00000 n
-0000079583 00000 n
-0000181623 00000 n
-0000079690 00000 n
-0000083936 00000 n
-0000181707 00000 n
-0000084043 00000 n
-0000087964 00000 n
-0000181791 00000 n
-0000088071 00000 n
-0000092366 00000 n
-0000181875 00000 n
-0000092473 00000 n
-0000096874 00000 n
-0000183761 00000 n
-0000181959 00000 n
-0000096981 00000 n
-0000101495 00000 n
-0000182043 00000 n
-0000101602 00000 n
-0000106459 00000 n
-0000182127 00000 n
-0000106566 00000 n
-0000110841 00000 n
-0000182211 00000 n
-0000110948 00000 n
-0000116045 00000 n
-0000182295 00000 n
-0000116152 00000 n
-0000120584 00000 n
-0000182379 00000 n
-0000120691 00000 n
-0000124810 00000 n
-0000182463 00000 n
-0000124917 00000 n
-0000128757 00000 n
-0000182547 00000 n
-0000128864 00000 n
-0000133155 00000 n
-0000182631 00000 n
-0000133262 00000 n
-0000137844 00000 n
-0000182715 00000 n
-0000137951 00000 n
-0000142543 00000 n
-0000183899 00000 n
-0000182801 00000 n
-0000142651 00000 n
-0000147707 00000 n
-0000182889 00000 n
-0000147815 00000 n
-0000152770 00000 n
-0000182977 00000 n
-0000152878 00000 n
-0000157539 00000 n
-0000183065 00000 n
-0000157647 00000 n
-0000162530 00000 n
-0000183153 00000 n
-0000162638 00000 n
-0000168152 00000 n
-0000183241 00000 n
-0000168260 00000 n
-0000172816 00000 n
-0000183329 00000 n
-0000172924 00000 n
-0000178568 00000 n
-0000178816 00000 n
-0000179019 00000 n
-0000183417 00000 n
-0000183446 00000 n
-0000184136 00000 n
-0000184260 00000 n
+0000042755 00000 n
+0000181074 00000 n
+0000042862 00000 n
+0000048040 00000 n
+0000181157 00000 n
+0000048147 00000 n
+0000052789 00000 n
+0000184152 00000 n
+0000183745 00000 n
+0000181241 00000 n
+0000052896 00000 n
+0000057391 00000 n
+0000181325 00000 n
+0000057498 00000 n
+0000061890 00000 n
+0000181409 00000 n
+0000061997 00000 n
+0000066458 00000 n
+0000181493 00000 n
+0000066565 00000 n
+0000070787 00000 n
+0000181577 00000 n
+0000070894 00000 n
+0000075155 00000 n
+0000181661 00000 n
+0000075262 00000 n
+0000079688 00000 n
+0000181745 00000 n
+0000079795 00000 n
+0000084041 00000 n
+0000181829 00000 n
+0000084148 00000 n
+0000088069 00000 n
+0000181913 00000 n
+0000088176 00000 n
+0000092385 00000 n
+0000181997 00000 n
+0000092492 00000 n
+0000096897 00000 n
+0000183883 00000 n
+0000182081 00000 n
+0000097004 00000 n
+0000101614 00000 n
+0000182165 00000 n
+0000101721 00000 n
+0000106500 00000 n
+0000182249 00000 n
+0000106607 00000 n
+0000110899 00000 n
+0000182333 00000 n
+0000111006 00000 n
+0000116178 00000 n
+0000182417 00000 n
+0000116285 00000 n
+0000120688 00000 n
+0000182501 00000 n
+0000120795 00000 n
+0000124888 00000 n
+0000182585 00000 n
+0000124995 00000 n
+0000128792 00000 n
+0000182669 00000 n
+0000128899 00000 n
+0000133188 00000 n
+0000182753 00000 n
+0000133295 00000 n
+0000137963 00000 n
+0000182837 00000 n
+0000138070 00000 n
+0000142662 00000 n
+0000184021 00000 n
+0000182923 00000 n
+0000142770 00000 n
+0000147746 00000 n
+0000183011 00000 n
+0000147854 00000 n
+0000152813 00000 n
+0000183099 00000 n
+0000152921 00000 n
+0000157622 00000 n
+0000183187 00000 n
+0000157730 00000 n
+0000162570 00000 n
+0000183275 00000 n
+0000162678 00000 n
+0000168224 00000 n
+0000183363 00000 n
+0000168332 00000 n
+0000172780 00000 n
+0000183451 00000 n
+0000172888 00000 n
+0000178690 00000 n
+0000178938 00000 n
+0000179141 00000 n
+0000183539 00000 n
+0000183568 00000 n
+0000184258 00000 n
+0000184382 00000 n
trailer
<<
/Size 129
/Root 128 0 R
/Info 127 0 R
-/ID [<a064b100c4ac0314449b71a9bdac8151><a064b100c4ac0314449b71a9bdac8151>]
+/ID [<d3eee021c6ea00eaa56475e7adf617d7><d3eee021c6ea00eaa56475e7adf617d7>]
>>
startxref
-184332
+184454
%%EOF
diff --git a/html/Shift.pdf b/html/Shift.pdf
index 14a93d56..d536882f 100644
--- a/html/Shift.pdf
+++ b/html/Shift.pdf
@@ -486,7 +486,7 @@ T*
0.6 0 TD
(l\(3pm\))Tj
-12.6 -4.4 TD
-(perl v5.18.4 2024-01-10 SHIFT\(1\))Tj
+(perl v5.18.4 2024-01-22 SHIFT\(1\))Tj
ET
endstream
endobj
@@ -593,8 +593,8 @@ endobj
endobj
16 0 obj
<<
-/CreationDate (D:20240110140144-05'00')
-/ModDate (D:20240110140144-05'00')
+/CreationDate (D:20240123091136-05'00')
+/ModDate (D:20240123091136-05'00')
/Producer (Apple pstopdf)
>>
endobj
@@ -630,7 +630,7 @@ trailer
/Size 18
/Root 17 0 R
/Info 16 0 R
-/ID [<8bf07463eb0d663c9de5155b01dbb98b><8bf07463eb0d663c9de5155b01dbb98b>]
+/ID [<c210869b445d50135836b61f215929db><c210869b445d50135836b61f215929db>]
>>
startxref
11800
diff --git a/html/TagNames/Nikon.html b/html/TagNames/Nikon.html
index bc035897..d8b76eed 100644
--- a/html/TagNames/Nikon.html
+++ b/html/TagNames/Nikon.html
@@ -12940,6 +12940,7 @@ for ExifTool to choose in these cases (see the
</tr><tr><td>'02 46 5C 82 25 25 02 00'</td><td>= Sigma 70-210mm F2.8 APO</td>
</tr><tr><td>'02 48 50 50 24 24 02 00'</td><td>= Sigma Macro 50mm F2.8</td>
</tr><tr><td>'02 48 65 65 24 24 02 00'</td><td>= Sigma Macro 90mm F2.8</td>
+</tr><tr><td>'02 54 3C 3C 0C 0C 00 00'</td><td>= Zeiss Otus 1.4/28 ZF.2</td>
</tr><tr><td>'03 43 5C 81 35 35 02 00'</td><td>= Soligor AF C/D Zoom UMCS 70-210mm 1:4.5</td>
</tr><tr><td>'03 48 5C 81 30 30 02 00'</td><td>= AF Zoom-Nikkor 70-210mm f/4</td>
</tr><tr><td>'03 54 68 68 0C 0C 00 00'</td><td>= Zeiss Otus 1.4/100</td>
@@ -13448,6 +13449,7 @@ for ExifTool to choose in these cases (see the
</tr><tr><td>'FC 40 2D 80 2C 40 DF 06'</td><td>= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)</td>
</tr><tr><td>'FD 00 44 44 18 18 DF 00'</td><td>= Voigtlander APO-Lanthar 35mm F2</td>
</tr><tr><td>'FD 00 50 50 18 18 DF 00'</td><td>= Voigtlander APO-Lanthar 50mm F2 Aspherical</td>
+</tr><tr><td>'FD 00 59 59 18 18 DF 00'</td><td>= Voigtlander Macro APO-Lanthar 65mm F2</td>
</tr><tr><td>'FD 47 50 76 24 24 4B 06'</td><td>= Sigma 50-150mm F2.8 EX APO DC HSM II</td>
</tr><tr><td>'FE 47 00 00 24 24 4B 06'</td><td>= Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye</td>
</tr><tr><td>'FE 48 37 5C 24 24 DF 0E'</td><td>= Tamron SP 24-70mm f/2.8 Di VC USD (A007)</td>
@@ -13459,7 +13461,7 @@ for ExifTool to choose in these cases (see the
<hr>
(This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Dec 21, 2023</i>
+<br><i>Last revised Jan 22, 2024</i>
<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
</body>
</html>
diff --git a/html/TagNames/QuickTime.html b/html/TagNames/QuickTime.html
index af4be1cf..d41aa554 100644
--- a/html/TagNames/QuickTime.html
+++ b/html/TagNames/QuickTime.html
@@ -864,15 +864,25 @@ changed via <a href="../config.html#PREF">the config file</a>.</p>
<td class=c>yes</td>
<td>&nbsp;</td></tr>
<tr class=b>
+<td>'compatible_brands'</td>
+<td>CompatibleBrands</td>
+<td class=c title=' / = Avoid'>yes/</td>
+<td>&nbsp;</td></tr>
+<tr>
<td>'content.identifier'</td>
<td>ContentIdentifier</td>
<td class=c>yes</td>
<td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
<td>'copyright'</td>
<td>Copyright</td>
<td class=c>yes</td>
<td>&nbsp;</td></tr>
+<tr>
+<td>'creation_time'</td>
+<td>CreationTime</td>
+<td class=c title=' / = Avoid'>yes/</td>
+<td>&nbsp;</td></tr>
<tr class=b>
<td>'creationdate'</td>
<td>CreationDate</td>
@@ -1007,10 +1017,20 @@ after the decimal)</span></span></td></tr>
<br>1 = Real Location
<br>2 = Fictional Location</span></td></tr>
<tr class=b>
+<td>'major_brand'</td>
+<td>MajorBrand</td>
+<td class=c title=' / = Avoid'>yes/</td>
+<td>&nbsp;</td></tr>
+<tr>
<td>'make'</td>
<td>Make</td>
<td class=c>yes</td>
<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'minor_version'</td>
+<td>MinorVersion</td>
+<td class=c title=' / = Avoid'>yes/</td>
+<td>&nbsp;</td></tr>
<tr>
<td>'model'</td>
<td>Model</td>
@@ -9149,7 +9169,7 @@ yaw, pitch and roll angles in degrees)</span></span></td></tr>
<hr>
(This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 10, 2024</i>
+<br><i>Last revised Jan 22, 2024</i>
<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
</body>
</html>
diff --git a/html/TagNames/index.html b/html/TagNames/index.html
index 6a0990ad..d4ac0ebf 100644
--- a/html/TagNames/index.html
+++ b/html/TagNames/index.html
@@ -10,7 +10,7 @@
<h2 class=top>ExifTool Tag Names</h2>
<p>
The tables listed below give the names of all tags recognized by ExifTool.
-They contain a total of 27469 tags, with 17233 unique tag names.
+They contain a total of 27473 tags, with 17233 unique tag names.
</p>
<blockquote>
<table width='100%' class=frame><tr><td>
@@ -248,7 +248,7 @@ ExifTool. A big thanks to everyone who has helped with this so far!)</i>
<hr>
(This document generated automatically by Image::ExifTool::BuildTagLookup)
<br><i>Created Feb 15, 2005</i>
-<br><i>Last revised Jan 10, 2024</i>
+<br><i>Last revised Jan 22, 2024</i>
<p class=lf><a href='../index.html'>&lt;-- Back to ExifTool home page</a></p>
</body>
</html>
diff --git a/html/exiftool_pod.html b/html/exiftool_pod.html
index b1962cc7..aef34985 100644
--- a/html/exiftool_pod.html
+++ b/html/exiftool_pod.html
@@ -201,7 +201,7 @@
-lang [LANG] Set current language
-listItem INDEX Extract specific item from a list
-n (--printConv) No print conversion
- -p FMTFILE (-printFormat) Print output in specified format
+ -p[-] STR (-printFormat) Print output in specified format
-php Export tags as a PHP Array
-s[NUM] (-short) Short output format (-s for tag names)
-S (-veryShort) Very short output format
@@ -672,12 +672,12 @@
&gt; exiftool -Orientation#=6 a.jpg</code></pre>
</dd>
-<dt id="p-FMTFILE-or-STR--printFormat"><b>-p</b> <i>FMTFILE</i> or <i>STR</i> (<b>-printFormat</b>)</dt>
+<dt id="p---STR-or-FMTFILE--printFormat"><b>-p</b>[-] <i>STR</i> or <i>FMTFILE</i> (<b>-printFormat</b>)</dt>
<dd>
-<p>Print output in the format specified by the given file or string. The argument is interpreted as a string unless a file of that name exists, in which case the string is loaded from the contents of the file. Tag names in the format file or string begin with a <code>$</code> symbol and may contain leading group names and/or a trailing <code>#</code> (to disable print conversion). Case is not significant. Braces <code>{}</code> may be used around the tag name to separate it from subsequent text (and must be used if subsequent text begins with an alphanumeric character, hyphen, underline, colon or number sign). Use <code>$$</code> to represent a <code>$</code> symbol, and <code>$/</code> for a newline.</p>
+<p>Print output in the format specified by the given string or file. The argument is interpreted as a string unless a file of that name exists, in which case the string is loaded from the contents of the file. Tag names in the format string or file begin with a <code>$</code> symbol and may contain leading group names and/or a trailing <code>#</code> (to disable print conversion). Case is not significant. Braces <code>{}</code> may be used around the tag name to separate it from subsequent text (and must be used if subsequent text begins with an alphanumeric character, hyphen, underline, colon or number sign). Use <code>$$</code> to represent a <code>$</code> symbol, and <code>$/</code> for a newline. When the string argument is used (ie. <i>STR</i>), a newline is added to the end of the string unless <b>-p-</b> is specified.</p>
-<p>Multiple <b>-p</b> options may be used, each contributing a line (or more) of text to the output. Lines beginning with <code>#[HEAD]</code> and <code>#[TAIL]</code> are output before the first processed file and after the last processed file respectively. Lines beginning with <code>#[SECT]</code> and <code>#[ENDS]</code> are output before and after each section of files. A section is defined as a group of consecutive files with the same section header (eg. files are grouped by directory if <code>#[SECT]</code> contains <code>$directory</code>). Lines beginning with <code>#[BODY]</code> and lines not beginning with <code>#</code> are output for each processed file. Lines beginning with <code>#[IF]</code> are not output, but all BODY lines are skipped if any tag on an IF line doesn&#39;t exist. Other lines beginning with <code>#</code> are ignored. (To output a line beginning with <code>#</code>, use <code>#[BODY]#</code>.) For example, this format file:</p>
+<p>Multiple <b>-p</b> options may be used. Lines beginning with <code>#[HEAD]</code> and <code>#[TAIL]</code> are output before the first processed file and after the last processed file respectively. Lines beginning with <code>#[SECT]</code> and <code>#[ENDS]</code> are output before and after each section of files. A section is defined as a group of consecutive files with the same section header (eg. files are grouped by directory if <code>#[SECT]</code> contains <code>$directory</code>). Lines beginning with <code>#[BODY]</code> and lines not beginning with <code>#</code> are output for each processed file. Lines beginning with <code>#[IF]</code> are not output, but all BODY lines are skipped if any tag on an IF line doesn&#39;t exist. Other lines beginning with <code>#</code> are ignored. (To output a line beginning with <code>#</code>, use <code>#[BODY]#</code>.) For example, this format file:</p>
<pre><code> # this is a comment line
#[HEAD]-- Generated by ExifTool $exifToolVersion --
@@ -691,14 +691,14 @@
<p>produces output like this:</p>
-<pre><code> -- Generated by ExifTool 12.73 --
+<pre><code> -- Generated by ExifTool 12.74 --
File: a.jpg - 2003:10:31 15:44:19
(f/5.6, 1/60s, ISO 100)
File: b.jpg - 2006:05:23 11:57:38
(f/8.0, 1/13s, ISO 100)
-- end --</code></pre>
-<p>The values of List-type tags with multiple items and Shortcut tags representing multiple tags are joined according the <b>-sep</b> option setting when interpolated in the string.</p>
+<p>The values of List-type tags with multiple items, Shortcut tags representing multiple tags, and matching tags when the <code>All</code> group is specified are joined according the <b>-sep</b> option setting when interpolated in the string. (Note that when <code>All</code> is used as a group name, dupicate tags are included regardless of the Duplicates option setting.) When <code>All</code> is used as a tag name, a value of 1 is returned if any tag exists in the specified group, or 0 otherwise (unless the <code>All</code> group is also specified, in which case the values of all matching tags are joined).</p>
<p>When <b>-ee</b> (<b>-extractEmbedded</b>) is combined with <b>-p</b>, embedded documents are effectively processed as separate input files.</p>
@@ -1268,7 +1268,7 @@
<dt id="api-OPT-VAL"><b>-api</b> [<i>OPT[[^]=[VAL]]</i>]</dt>
<dd>
-<p>Set ExifTool API option. <i>OPT</i> is an API option name. The option value is set to 1 if <i>=VAL</i> is omitted. If <i>VAL</i> is omitted, the option value is set to undef if <code>=</code> is used, or an empty string with <code>^=</code>. If <i>OPT</i> is not specified a list of available options is returned. The option name is not case senstive, but the option values are. See <a>Image::ExifTool Options</a> for option details. This overrides API options set via the config file.</p>
+<p>Set ExifTool API option. <i>OPT</i> is an API option name. The option value is set to 1 if <i>=VAL</i> is omitted. If <i>VAL</i> is omitted, the option value is set to undef if <code>=</code> is used, or an empty string with <code>^=</code>. If <i>OPT</i> is not specified a list of available options is returned. The option name is not case senstive, but the option values are. See <a>Image::ExifTool Options</a> for option details. This overrides API options set via the config file. Note that the exiftool app sets some API options internally, and attempts to change these via the command line will have no effect.</p>
</dd>
<dt id="common_args"><b>-common_args</b></dt>
diff --git a/html/exiftool_pod.pdf b/html/exiftool_pod.pdf
index 060924ed..de4579a7 100644
--- a/html/exiftool_pod.pdf
+++ b/html/exiftool_pod.pdf
@@ -12,7 +12,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 1)Tj
+( -- ExifTool 12.74 -- 1)Tj
/TT4 1 Tf
0 -1.6333 TD
(EXIFTOOL\(1\) User Contributed Perl Documentation EXIFTOOL\(1\))Tj
@@ -637,7 +637,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 2)Tj
+( -- ExifTool 12.74 -- 2)Tj
/TT4 1 Tf
0 -1.6333 TD
( ASF r | FFF r/w | M4A/V r/w | PCD r | THM r/w)Tj
@@ -834,7 +834,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 3)Tj
+( -- ExifTool 12.74 -- 3)Tj
/TT4 1 Tf
0 -1.6333 TD
( -b \(-binary\) Output metadata in binary format)Tj
@@ -877,7 +877,7 @@ T*
T*
( -n \(--printConv\) No print conversion)Tj
T*
-( -p FMTFILE \(-printFormat\) Print output in specified format)Tj
+( -p[-] STR \(-printFormat\) Print output in specified format)Tj
T*
( -php Export tags as a PHP Array)Tj
T*
@@ -993,7 +993,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 4)Tj
+( -- ExifTool 12.74 -- 4)Tj
/TT4 1 Tf
0 -2.7333 TD
( -geotag TRKFILE Geotag images from specified GPS log)Tj
@@ -1282,7 +1282,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 5)Tj
+( -- ExifTool 12.74 -- 5)Tj
/TT4 1 Tf
0 -1.6333 TD
( excluded\), or to exclude groups from being deleted when deleting)Tj
@@ -1617,7 +1617,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 6)Tj
+( -- ExifTool 12.74 -- 6)Tj
/TT4 1 Tf
0 -1.6333 TD
( assignments affect the same tag, the latter takes precedence)Tj
@@ -1990,7 +1990,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 7)Tj
+( -- ExifTool 12.74 -- 7)Tj
/TT4 1 Tf
0 -1.6333 TD
( is used as a group name, then the specified tag\(s\) are written to)Tj
@@ -2491,7 +2491,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 8)Tj
+( -- ExifTool 12.74 -- 8)Tj
/TT4 1 Tf
0 -1.6333 TD
( 3\) The maker note information is copied as a block, so it isn't)Tj
@@ -2812,7 +2812,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 9)Tj
+( -- ExifTool 12.74 -- 9)Tj
/TT4 1 Tf
0 -1.6333 TD
( --_)Tj
@@ -3265,7 +3265,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 10)Tj
+( -- ExifTool 12.74 -- 10)Tj
/TT4 1 Tf
0 -1.6333 TD
( 3\) This print formatting may be disabled with the -)Tj
@@ -3606,7 +3606,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 11)Tj
+( -- ExifTool 12.74 -- 11)Tj
/TT4 1 Tf
0 -1.6333 TD
( required.)Tj
@@ -3949,7 +3949,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 12)Tj
+( -- ExifTool 12.74 -- 12)Tj
/TT4 1 Tf
0 -1.6333 TD
( effect on date-only or time-only tags and ignores timezone)Tj
@@ -4624,7 +4624,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 13)Tj
+( -- ExifTool 12.74 -- 13)Tj
/TT4 1 Tf
0 -1.6333 TD
( provided, the EXIF/TIFF base offset is used. Use -)Tj
@@ -5139,7 +5139,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 14)Tj
+( -- ExifTool 12.74 -- 14)Tj
/TT4 1 Tf
0 -1.6333 TD
( always English, independent of the -)Tj
@@ -5378,7 +5378,7 @@ endobj
endobj
50 0 obj
<<
-/Length 5378
+/Length 5405
>>
stream
BT
@@ -5388,7 +5388,7 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 15)Tj
+( -- ExifTool 12.74 -- 15)Tj
/TT4 1 Tf
0 -1.6333 TD
( > exiftool -Orientation# -Orientation -S a.jpg)Tj
@@ -5413,8 +5413,14 @@ T*
4.2 0 TD
(-p)Tj
0.6 0 TD
-(p _)Tj
-1.2 0 TD
+(p[-] _)Tj
+3 0 TD
+(S_)Tj
+0.6 0 TD
+(T_)Tj
+0.6 0 TD
+(R or _)Tj
+3 0 TD
(F_)Tj
0.6 0 TD
(M_)Tj
@@ -5427,13 +5433,7 @@ T*
0.6 0 TD
(L_)Tj
0.6 0 TD
-(E or _)Tj
-3 0 TD
-(S_)Tj
-0.6 0 TD
-(T_)Tj
-0.6 0 TD
-(R \(-)Tj
+(E \(-)Tj
1.8 0 TD
(-p)Tj
0.6 0 TD
@@ -5458,14 +5458,14 @@ T*
(at)Tj
0.6 0 TD
(t\))Tj
--22.2 -1.1 TD
-( Print output in the format specified by the given file or string.)Tj
+-24 -1.1 TD
+( Print output in the format specified by the given string or file.)Tj
T*
( The argument is interpreted as a string unless a file of that name)Tj
T*
( exists, in which case the string is loaded from the contents of)Tj
T*
-( the file. Tag names in the format file or string begin with a "$")Tj
+( the file. Tag names in the format string or file begin with a "$")Tj
T*
( symbol and may contain leading group names and/or a trailing "#")Tj
T*
@@ -5478,36 +5478,50 @@ T*
( an alphanumeric character, hyphen, underline, colon or number)Tj
T*
( sign\). Use $$ to represent a "$" symbol, and $/ for a newline.)Tj
-0 -2.2 TD
+T*
+( When the string argument is used \(ie. _)Tj
+30 0 TD
+(S_)Tj
+0.6 0 TD
+(T_)Tj
+0.6 0 TD
+(R\), a newline is added to)Tj
+-31.2 -1.1 TD
+( the end of the string unless -)Tj
+24.6 0 TD
+(-p)Tj
+0.6 0 TD
+(p-)Tj
+0.6 0 TD
+(- is specified.)Tj
+-25.8 -2.2 TD
( Multiple -)Tj
12.6 0 TD
(-p)Tj
0.6 0 TD
-(p options may be used, each contributing a line \(or)Tj
+(p options may be used. Lines beginning with "#[HEAD]")Tj
-13.2 -1.1 TD
-( more\) of text to the output. Lines beginning with "#[HEAD]" and)Tj
-T*
-( "#[TAIL]" are output before the first processed file and after the)Tj
+( and "#[TAIL]" are output before the first processed file and after)Tj
T*
-( last processed file respectively. Lines beginning with "#[SECT]")Tj
+( the last processed file respectively. Lines beginning with)Tj
T*
-( and "#[ENDS]" are output before and after each section of files.)Tj
+( "#[SECT]" and "#[ENDS]" are output before and after each section)Tj
T*
-( A section is defined as a group of consecutive files with the same)Tj
+( of files. A section is defined as a group of consecutive files)Tj
T*
-( section header \(eg. files are grouped by directory if "#[SECT]")Tj
+( with the same section header \(eg. files are grouped by directory)Tj
T*
-( contains $directory\). Lines beginning with "#[BODY]" and lines)Tj
+( if "#[SECT]" contains $directory\). Lines beginning with "#[BODY]")Tj
T*
-( not beginning with "#" are output for each processed file. Lines)Tj
+( and lines not beginning with "#" are output for each processed)Tj
T*
-( beginning with "#[IF]" are not output, but all BODY lines are)Tj
+( file. Lines beginning with "#[IF]" are not output, but all BODY)Tj
T*
-( skipped if any tag on an IF line doesn't exist. Other lines)Tj
+( lines are skipped if any tag on an IF line doesn't exist. Other)Tj
T*
-( beginning with "#" are ignored. \(To output a line beginning with)Tj
+( lines beginning with "#" are ignored. \(To output a line beginning)Tj
T*
-( "#", use "#[BODY]#".\) For example, this format file:)Tj
+( with "#", use "#[BODY]#".\) For example, this format file:)Tj
0 -2.2 TD
( # this is a comment line)Tj
0 -1.1 TD
@@ -5525,7 +5539,7 @@ T*
T*
( produces output like this:)Tj
T*
-( -- Generated by ExifTool 12.73 --)Tj
+( -- Generated by ExifTool 12.74 --)Tj
0 -1.1 TD
( File: a.jpg - 2003:10:31 15:44:19)Tj
T*
@@ -5537,19 +5551,31 @@ T*
T*
( -- end --)Tj
0 -2.2 TD
-( The values of List-type tags with multiple items and Shortcut tags)Tj
+( The values of List-type tags with multiple items, Shortcut tags)Tj
0 -1.1 TD
-( representing multiple tags are joined according the -)Tj
-38.4 0 TD
+( representing multiple tags, and matching tags when the "All" group)Tj
+T*
+( is specified are joined according the -)Tj
+30 0 TD
(-s)Tj
0.6 0 TD
(se)Tj
0.6 0 TD
(ep)Tj
0.6 0 TD
-(p option)Tj
--40.2 -1.1 TD
-( setting when interpolated in the string.)Tj
+(p option setting when)Tj
+-31.8 -1.1 TD
+( interpolated in the string. \(Note that when "All" is used as a)Tj
+T*
+( group name, dupicate tags are included regardless of the)Tj
+T*
+( Duplicates option setting.\) When "All" is used as a tag name, a)Tj
+T*
+( value of 1 is returned if any tag exists in the specified group,)Tj
+T*
+( or 0 otherwise \(unless the "All" group is also specified, in which)Tj
+T*
+( case the values of all matching tags are joined\).)Tj
0 -2.2 TD
( When -)Tj
10.2 0 TD
@@ -5596,34 +5622,6 @@ T*
(p, embedded)Tj
-34.8 -1.1 TD
( documents are effectively processed as separate input files.)Tj
-0 -2.2 TD
-( If a specified tag does not exist, a minor warning is issued and)Tj
-0 -1.1 TD
-( the line with the missing tag is not printed. However, the -)Tj
-43.2 0 TD
-(-f)Tj
-0.6 0 TD
-(f)Tj
--43.8 -1.1 TD
-( option may be used to set the value of missing tags to '-' \(but)Tj
-T*
-( this may be configured via the API MissingTagValue option\), or the)Tj
-T*
-( -)Tj
-7.2 0 TD
-(-m)Tj
-0.6 0 TD
-(m option may be used to ignore minor warnings and leave the)Tj
--7.8 -1.1 TD
-( missing values empty. Alternatively, -)Tj
-30 0 TD
-(-q)Tj
-0.6 0 TD
-(q -)Tj
-1.2 0 TD
-(-q)Tj
-0.6 0 TD
-(q may be used to simply)Tj
ET
endstream
endobj
@@ -5641,7 +5639,7 @@ endobj
endobj
53 0 obj
<<
-/Length 7764
+/Length 7509
>>
stream
BT
@@ -5651,9 +5649,37 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 16)Tj
+( -- ExifTool 12.74 -- 16)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
+( If a specified tag does not exist, a minor warning is issued and)Tj
+0 -1.1 TD
+( the line with the missing tag is not printed. However, the -)Tj
+43.2 0 TD
+(-f)Tj
+0.6 0 TD
+(f)Tj
+-43.8 -1.1 TD
+( option may be used to set the value of missing tags to '-' \(but)Tj
+T*
+( this may be configured via the API MissingTagValue option\), or the)Tj
+T*
+( -)Tj
+7.2 0 TD
+(-m)Tj
+0.6 0 TD
+(m option may be used to ignore minor warnings and leave the)Tj
+-7.8 -1.1 TD
+( missing values empty. Alternatively, -)Tj
+30 0 TD
+(-q)Tj
+0.6 0 TD
+(q -)Tj
+1.2 0 TD
+(-q)Tj
+0.6 0 TD
+(q may be used to simply)Tj
+-32.4 -1.1 TD
( suppress the warning messages.)Tj
0 -2.2 TD
( The "Advanced formatting feature" may be used to modify the values)Tj
@@ -6113,7 +6139,36 @@ T*
( in the order they were specified on the command line, or if not)Tj
T*
( specified, the order they were extracted from the file. By)Tj
-T*
+ET
+endstream
+endobj
+54 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+56 0 obj
+<<
+/Length 7820
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 17)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( default, tags are organized by groups when combined with the -)Tj
43.8 0 TD
(-g)Tj
@@ -6183,38 +6238,9 @@ T*
(-j)Tj
0.6 0 TD
(j\) output formats. For other output formats,)Tj
-ET
-endstream
-endobj
-54 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-56 0 obj
-<<
-/Length 7326
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 17)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+-19.2 -1.1 TD
( XMP structures and lists are serialized into the same format as)Tj
-0 -1.1 TD
+T*
( when writing structured information \(see)Tj
T*
( <https://exiftool.org/struct.html> for details\). When copying,)Tj
@@ -6622,18 +6648,6 @@ T*
( directory:)Tj
0 -2.2 TD
( exiftool -filename -createdate -T -w+! %d/out.txt -r DIR)Tj
-T*
-( Capitalized format codes %D, %F, %E and %C provide slightly)Tj
-0 -1.1 TD
-( different alternatives to the lower case versions. %D does not)Tj
-T*
-( include the trailing '/', %F is the full filename including)Tj
-T*
-( extension, %E includes the leading '.', and %C increments the)Tj
-T*
-( count for each processed file \(see below\).)Tj
-0 -2.2 TD
-( Notes:)Tj
ET
endstream
endobj
@@ -6651,7 +6665,7 @@ endobj
endobj
59 0 obj
<<
-/Length 4538
+/Length 4437
>>
stream
BT
@@ -6661,9 +6675,21 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 18)Tj
+( -- ExifTool 12.74 -- 18)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( Capitalized format codes %D, %F, %E and %C provide slightly)Tj
+0 -1.1 TD
+( different alternatives to the lower case versions. %D does not)Tj
+T*
+( include the trailing '/', %F is the full filename including)Tj
+T*
+( extension, %E includes the leading '.', and %C increments the)Tj
+T*
+( count for each processed file \(see below\).)Tj
+0 -2.2 TD
+( Notes:)Tj
+T*
( 1\) In a Windows BAT file the "%" character is represented by "%%",)Tj
0 -1.1 TD
( so an argument like "%d%f.txt" is written as "%%d%%f.txt".)Tj
@@ -6765,20 +6791,6 @@ T*
( -w A%-cZ.txt # AZ.txt, A-1Z.txt, A-2Z.txt ...)Tj
0 -1.1 TD
( -w B%5c.txt # B.txt, B00001.txt, B00002.txt ...)Tj
-T*
-( -w C%.c.txt # C0.txt, C1.txt, C2.txt ...)Tj
-T*
-( -w D%-.c.txt # D-0.txt, D-1.txt, D-2.txt ...)Tj
-T*
-( -w E%-.4c.txt # E-0000.txt, E-0001.txt, E-0002.txt ...)Tj
-T*
-( -w F%-.4nc.txt # F-0001.txt, F-0002.txt, F-0003.txt ...)Tj
-T*
-( -w G%+c.txt # G.txt, G_1.txt G_2.txt ...)Tj
-T*
-( -w H%-lc.txt # H.txt, H-b.txt, H-c.txt ...)Tj
-T*
-( -w I.%.3uc.txt # I.AAA.txt, I.AAB.txt, I.AAC.txt ...)Tj
ET
endstream
endobj
@@ -6796,7 +6808,7 @@ endobj
endobj
62 0 obj
<<
-/Length 5916
+/Length 5755
>>
stream
BT
@@ -6806,9 +6818,23 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 19)Tj
+( -- ExifTool 12.74 -- 19)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( -w C%.c.txt # C0.txt, C1.txt, C2.txt ...)Tj
+0 -1.1 TD
+( -w D%-.c.txt # D-0.txt, D-1.txt, D-2.txt ...)Tj
+T*
+( -w E%-.4c.txt # E-0000.txt, E-0001.txt, E-0002.txt ...)Tj
+T*
+( -w F%-.4nc.txt # F-0001.txt, F-0002.txt, F-0003.txt ...)Tj
+T*
+( -w G%+c.txt # G.txt, G_1.txt G_2.txt ...)Tj
+T*
+( -w H%-lc.txt # H.txt, H-b.txt, H-c.txt ...)Tj
+T*
+( -w I.%.3uc.txt # I.AAA.txt, I.AAB.txt, I.AAC.txt ...)Tj
+0 -2.2 TD
( A special feature allows the copy number to be incremented for)Tj
0 -1.1 TD
( each processed file by using %C \(upper case\) instead of %c. This)Tj
@@ -7012,9 +7038,38 @@ T*
(W sends a list of the tags and output)Tj
-24 -1.1 TD
( file names to the console instead of giving a verbose dump of the)Tj
-T*
+ET
+endstream
+endobj
+63 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+65 0 obj
+<<
+/Length 8872
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 20)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( entire file. \(Unless appending all output to one file for each)Tj
-T*
+0 -1.1 TD
( source file by using -)Tj
19.8 0 TD
(-W)Tj
@@ -7050,36 +7105,7 @@ T*
(M_)Tj
0.6 0 TD
(T to give the files unique names.)Tj
-ET
-endstream
-endobj
-63 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-65 0 obj
-<<
-/Length 8601
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 20)Tj
-/TT4 1 Tf
-0 -2.7333 TD
+-23.4 -2.2 TD
( -)Tj
4.2 0 TD
(-W)Tj
@@ -7669,26 +7695,6 @@ T*
( substantially, especially for PDF files with many embedded images)Tj
T*
( or videos with streaming metadata.)Tj
-0 -2.2 TD
-( When used with -)Tj
-16.2 0 TD
-(-e)Tj
-0.6 0 TD
-(ee)Tj
-0.6 0 TD
-(e, the -)Tj
-4.2 0 TD
-(-p)Tj
-0.6 0 TD
-(p option is evaluated for each embedded)Tj
--22.2 -1.1 TD
-( document as if it were a separate input file. This allows, for)Tj
-T*
-( example, generation of GPS track logs from timed metadata in)Tj
-T*
-( videos. See <https://exiftool.org/geotag.html#Inverse> for)Tj
-T*
-( examples.)Tj
ET
endstream
endobj
@@ -7706,7 +7712,7 @@ endobj
endobj
68 0 obj
<<
-/Length 7681
+/Length 7116
>>
stream
BT
@@ -7716,9 +7722,29 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 21)Tj
+( -- ExifTool 12.74 -- 21)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
+( When used with -)Tj
+16.2 0 TD
+(-e)Tj
+0.6 0 TD
+(ee)Tj
+0.6 0 TD
+(e, the -)Tj
+4.2 0 TD
+(-p)Tj
+0.6 0 TD
+(p option is evaluated for each embedded)Tj
+-22.2 -1.1 TD
+( document as if it were a separate input file. This allows, for)Tj
+T*
+( example, generation of GPS track logs from timed metadata in)Tj
+T*
+( videos. See <https://exiftool.org/geotag.html#Inverse> for)Tj
+T*
+( examples.)Tj
+0 -2.2 TD
( Setting _)Tj
12 0 TD
(N_)Tj
@@ -8086,7 +8112,36 @@ T*
(4 doesn't even read the file header, and)Tj
-18.6 -1.1 TD
( returns only System tags and a FileType based on the file)Tj
-T*
+ET
+endstream
+endobj
+69 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+72 0 obj
+<<
+/Length 7914
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 22)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( extension. -)Tj
14.4 0 TD
(-f)Tj
@@ -8174,36 +8229,7 @@ T*
(er)Tj
0.6 0 TD
(r options for details.)Tj
-ET
-endstream
-endobj
-69 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-72 0 obj
-<<
-/Length 7721
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 22)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+-22.2 -2.2 TD
( -)Tj
4.2 0 TD
(-f)Tj
@@ -8601,7 +8627,36 @@ T*
(U_)Tj
0.6 0 TD
(M \(see)Tj
--43.2 -1.1 TD
+ET
+endstream
+endobj
+73 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+75 0 obj
+<<
+/Length 6756
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 23)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( the -)Tj
9.6 0 TD
(-f)Tj
@@ -8655,38 +8710,9 @@ T*
( enough files fail the condition.)Tj
0 -2.2 TD
( The expression has access to the current ExifTool object through)Tj
-ET
-endstream
-endobj
-73 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-75 0 obj
-<<
-/Length 6727
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 23)Tj
-/TT4 1 Tf
-0 -1.6333 TD
-( $self, and the following special functions are available to allow)Tj
0 -1.1 TD
+( $self, and the following special functions are available to allow)Tj
+T*
( short-circuiting of the file processing. Both functions have a)Tj
T*
( return value of 1. Case is significant for function names.)Tj
@@ -9002,7 +9028,36 @@ T*
(-o)Tj
0.6 0 TD
(o option.)Tj
--18 -2.2 TD
+ET
+endstream
+endobj
+76 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+78 0 obj
+<<
+/Length 8553
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 24)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( _)Tj
7.2 0 TD
(O_)Tj
@@ -9052,38 +9107,9 @@ T*
( string examples.)Tj
0 -2.2 TD
( The output file is taken to be a directory name if it already)Tj
-ET
-endstream
-endobj
-76 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-78 0 obj
-<<
-/Length 8565
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 24)Tj
-/TT4 1 Tf
-0 -1.6333 TD
-( exists as a directory or if the name ends with '/'. Output)Tj
0 -1.1 TD
+( exists as a directory or if the name ends with '/'. Output)Tj
+T*
( directories are created if necessary. Existing files will not be)Tj
T*
( overwritten. Combining the -)Tj
@@ -9621,9 +9647,38 @@ T*
( Specify password to allow processing of password-protected PDF)Tj
T*
( documents. If a password is required but not given, a warning is)Tj
-T*
+ET
+endstream
+endobj
+79 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+81 0 obj
+<<
+/Length 7391
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 25)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( issued and the document is not processed. This option is ignored)Tj
-T*
+0 -1.1 TD
( if a password is not required.)Tj
0 -2.2 TD
( -)Tj
@@ -9679,36 +9734,7 @@ T*
(s option adds a progress count in brackets after the name)Tj
-12 -1.1 TD
( of each processed file, giving the current file number and the)Tj
-ET
-endstream
-endobj
-79 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-81 0 obj
-<<
-/Length 6994
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 25)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+T*
( total number of files to be processed. Implies the -)Tj
38.4 0 TD
(-v)Tj
@@ -10114,16 +10140,6 @@ T*
( c - Create new tags)Tj
T*
( g - create new Groups as necessary)Tj
-0 -2.2 TD
-( For example, use "-wm cg" to only create new tags \(and avoid)Tj
-0 -1.1 TD
-( editing existing ones\).)Tj
-0 -2.2 TD
-( The level of the group is the SubDirectory level in the metadata)Tj
-0 -1.1 TD
-( structure. For XMP or IPTC this is the full XMP/IPTC block \(the)Tj
-T*
-( family 0 group\), but for EXIF this is the individual IFD \(the)Tj
ET
endstream
endobj
@@ -10141,7 +10157,7 @@ endobj
endobj
84 0 obj
<<
-/Length 8524
+/Length 8180
>>
stream
BT
@@ -10151,9 +10167,19 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 26)Tj
+( -- ExifTool 12.74 -- 26)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
+( For example, use "-wm cg" to only create new tags \(and avoid)Tj
+0 -1.1 TD
+( editing existing ones\).)Tj
+0 -2.2 TD
+( The level of the group is the SubDirectory level in the metadata)Tj
+0 -1.1 TD
+( structure. For XMP or IPTC this is the full XMP/IPTC block \(the)Tj
+T*
+( family 0 group\), but for EXIF this is the individual IFD \(the)Tj
+T*
( family 1 group\).)Tj
0 -2.2 TD
( -)Tj
@@ -10715,7 +10741,36 @@ T*
(tr)Tj
0.6 0 TD
(r or)Tj
--42 -1.1 TD
+ET
+endstream
+endobj
+85 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+87 0 obj
+<<
+/Length 6394
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 27)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( -)Tj
7.2 0 TD
(-l)Tj
@@ -10763,38 +10818,9 @@ T*
( -list -EXIF:All # list all EXIF tags)Tj
T*
( -list -xmp:time:all # list all XMP tags relating to time)Tj
-ET
-endstream
-endobj
-85 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-87 0 obj
-<<
-/Length 6031
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 27)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+T*
( -listw -XMP-dc:All # list all writable XMP-dc tags)Tj
-0 -1.1 TD
+T*
( -listf # list all supported file extensions)Tj
T*
( -listr # list all recognized file extensions)Tj
@@ -11038,16 +11064,6 @@ T*
( in QuickTime-format files. Note that GPSPitch and GPSRoll are)Tj
T*
( non-standard, and require user-defined tags in order to be)Tj
-T*
-( written.)Tj
-0 -2.2 TD
-( The "Geosync" tag may be used to specify a time correction which)Tj
-0 -1.1 TD
-( is applied to each "Geotime" value for synchronization with GPS)Tj
-T*
-( time. For example, the following command compensates for image)Tj
-T*
-( times which are 1 minute and 20 seconds behind GPS:)Tj
ET
endstream
endobj
@@ -11065,7 +11081,7 @@ endobj
endobj
90 0 obj
<<
-/Length 6885
+/Length 6614
>>
stream
BT
@@ -11075,11 +11091,21 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 28)Tj
+( -- ExifTool 12.74 -- 28)Tj
/TT4 1 Tf
0 -1.6333 TD
-( exiftool -geosync=+1:20 -geotag a.log DIR)Tj
+( written.)Tj
+0 -2.2 TD
+( The "Geosync" tag may be used to specify a time correction which)Tj
+0 -1.1 TD
+( is applied to each "Geotime" value for synchronization with GPS)Tj
+T*
+( time. For example, the following command compensates for image)Tj
+T*
+( times which are 1 minute and 20 seconds behind GPS:)Tj
0 -2.2 TD
+( exiftool -geosync=+1:20 -geotag a.log DIR)Tj
+T*
( Advanced "Geosync" features allow a piecewise linear time drift)Tj
0 -1.1 TD
( correction and synchronization from previously geotagged images.)Tj
@@ -11469,7 +11495,36 @@ T*
( directory "DIR":)Tj
0 -2.2 TD
( exiftool -restore_original -ext jpg DIR)Tj
-T*
+ET
+endstream
+endobj
+91 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+93 0 obj
+<<
+/Length 9364
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 29)Tj
+/TT4 1 Tf
+0 -2.7333 TD
( The -)Tj
9.6 0 TD
(-d)Tj
@@ -11511,38 +11566,9 @@ T*
( the following command deletes "a.jpg_original" if it exists, after)Tj
T*
( asking "Are you sure?":)Tj
-ET
-endstream
-endobj
-91 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-93 0 obj
-<<
-/Length 9911
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 29)Tj
-/TT4 1 Tf
-0 -1.6333 TD
-( exiftool -delete_original a.jpg)Tj
0 -2.2 TD
+( exiftool -delete_original a.jpg)Tj
+T*
( These options may not be used with other options to read or write)Tj
0 -1.1 TD
( tag values in the same command, but may be combined with options)Tj
@@ -11695,7 +11721,11 @@ T*
T*
( values are. See Image::ExifTool Options for option details. This)Tj
T*
-( overrides API options set via the config file.)Tj
+( overrides API options set via the config file. Note that the)Tj
+T*
+( exiftool app sets some API options internally, and attempts to)Tj
+T*
+( change these via the command line will have no effect.)Tj
0 -2.2 TD
( -)Tj
4.2 0 TD
@@ -12182,7 +12212,36 @@ T*
(e!)Tj
0.6 0 TD
(!\). Saves the)Tj
--38.4 -1.1 TD
+ET
+endstream
+endobj
+94 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+96 0 obj
+<<
+/Length 8097
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 30)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( name of the file specified by the -)Tj
27.6 0 TD
(-s)Tj
@@ -12288,36 +12347,7 @@ T*
(U_)Tj
0.6 0 TD
(M is an optional number)Tj
-ET
-endstream
-endobj
-94 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-96 0 obj
-<<
-/Length 7822
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 30)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+-33 -1.1 TD
( that is echoed in the "{ready}" message when using the -)Tj
40.2 0 TD
(-s)Tj
@@ -12751,7 +12781,36 @@ T*
(L_)Tj
0.6 0 TD
(E, which may)Tj
--39.6 -1.1 TD
+ET
+endstream
+endobj
+97 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+99 0 obj
+<<
+/Length 8008
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 31)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( be useful when specifying multiple -)Tj
28.2 0 TD
(-s)Tj
@@ -12833,36 +12892,7 @@ T*
(A_)Tj
0.6 0 TD
(G is 1 or "True" \(case insensitive\), causes exiftool keep)Tj
-ET
-endstream
-endobj
-97 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-99 0 obj
-<<
-/Length 8146
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 31)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+-10.8 -1.1 TD
( reading from the -)Tj
17.4 0 TD
(-@)Tj
@@ -13322,7 +13352,36 @@ T*
(A_)Tj
0.6 0 TD
(L is)Tj
--42 -1.1 TD
+ET
+endstream
+endobj
+100 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+103 0 obj
+<<
+/Length 5032
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 32)Tj
+/TT4 1 Tf
+0 -1.6333 TD
( omitted, undef if just _)Tj
21 0 TD
(V_)Tj
@@ -13432,38 +13491,9 @@ T*
(le)Tj
0.6 0 TD
(e)Tj
-ET
-endstream
-endobj
-100 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-103 0 obj
-<<
-/Length 4191
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 32)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+-46.2 -1.1 TD
( redirection string. Tag names within these strings are prefixed by a)Tj
-0 -1.1 TD
+T*
( "$" symbol, and an arbitrary Perl expression may be applied to the tag)Tj
T*
( value by placing braces around the tag name and inserting the)Tj
@@ -13577,16 +13607,6 @@ T*
(p option is necessary to split the string back into individual)Tj
-8.4 -1.1 TD
( list items when writing to a list-type tag.)Tj
-0 -2.2 TD
-( An optional flag argument may be set to 1 to cause "NoDups" to set $_)Tj
-0 -1.1 TD
-( to undef if no duplicates existed, thus preventing the file from being)Tj
-T*
-( rewritten unnecessarily:)Tj
-0 -2.2 TD
-( exiftool -sep '##' '-keywords<${keywords;NoDups\(1\)}' a.jpg)Tj
-T*
-( Note that function names are case sensitive.)Tj
ET
endstream
endobj
@@ -13604,7 +13624,7 @@ endobj
endobj
106 0 obj
<<
-/Length 6454
+/Length 5614
>>
stream
BT
@@ -13614,9 +13634,19 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 33)Tj
+( -- ExifTool 12.74 -- 33)Tj
/TT4 1 Tf
-0 -1.6333 TD
+0 -2.7333 TD
+( An optional flag argument may be set to 1 to cause "NoDups" to set $_)Tj
+0 -1.1 TD
+( to undef if no duplicates existed, thus preventing the file from being)Tj
+T*
+( rewritten unnecessarily:)Tj
+0 -2.2 TD
+( exiftool -sep '##' '-keywords<${keywords;NoDups\(1\)}' a.jpg)Tj
+T*
+( Note that function names are case sensitive.)Tj
+T*
( ExifTool 12.64 adds an API NoDups option which makes the NoDups helper)Tj
0 -1.1 TD
( function largely redundant, with all the functionality except the)Tj
@@ -13894,7 +13924,36 @@ T*
( 4\) Unicode file names with surrogate pairs \(code points over U+FFFF\))Tj
0 -1.1 TD
( still cause problems.)Tj
-0 -2.2 TD
+ET
+endstream
+endobj
+107 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+109 0 obj
+<<
+/Length 6043
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 34)Tj
+/TT4 1 Tf
+0 -1.6333 TD
(W)Tj
0 0 TD
(WR)Tj
@@ -14004,36 +14063,7 @@ T*
(e option.)Tj
-31.2 -2.2 TD
( 2\) When writing only pseudo System tags \(eg. FileModifyDate\).)Tj
-ET
-endstream
-endobj
-107 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-109 0 obj
-<<
-/Length 5314
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 34)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+T*
( 3\) On Windows if the file has Unicode characters in its name, and a\))Tj
0 -1.1 TD
( the -)Tj
@@ -14269,20 +14299,6 @@ T*
( Extract all types of preview images \(ThumbnailImage, PreviewImage,)Tj
T*
( JpgFromRaw, etc.\) from files in directory "dir", adding the tag)Tj
-T*
-( name to the output preview image file names.)Tj
-0 -2.2 TD
-( exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg .)Tj
-0 -1.1 TD
-( Print formatted date/time for all JPG files in the current)Tj
-T*
-( directory.)Tj
-0 -2.2 TD
-( exiftool -IFD1:XResolution -IFD1:YResolution image.jpg)Tj
-0 -1.1 TD
-( Extract image resolution from EXIF IFD1 information \(thumbnail)Tj
-T*
-( image IFD\).)Tj
ET
endstream
endobj
@@ -14300,7 +14316,7 @@ endobj
endobj
112 0 obj
<<
-/Length 4319
+/Length 4302
>>
stream
BT
@@ -14310,9 +14326,23 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 35)Tj
+( -- ExifTool 12.74 -- 35)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( name to the output preview image file names.)Tj
+0 -2.2 TD
+( exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg .)Tj
+0 -1.1 TD
+( Print formatted date/time for all JPG files in the current)Tj
+T*
+( directory.)Tj
+0 -2.2 TD
+( exiftool -IFD1:XResolution -IFD1:YResolution image.jpg)Tj
+0 -1.1 TD
+( Extract image resolution from EXIF IFD1 information \(thumbnail)Tj
+T*
+( image IFD\).)Tj
+0 -2.2 TD
( exiftool '-*resolution*' image.jpg)Tj
0 -1.1 TD
( Extract all tags with names containing the word "Resolution" from)Tj
@@ -14436,20 +14466,6 @@ T*
( Decrement the value of ExposureCompensation by 0.5 EV. Note that)Tj
T*
( += with a negative value is used for decrementing because the -=)Tj
-T*
-( operator is used for conditional deletion \(see next example\).)Tj
-0 -2.2 TD
-( exiftool -credit-=xxx dir)Tj
-0 -1.1 TD
-( Delete Credit information from all files in a directory where the)Tj
-T*
-( Credit value was "xxx".)Tj
-0 -2.2 TD
-( exiftool -xmp:description-de='k&uuml;hl' -E dst.jpg)Tj
-0 -1.1 TD
-( Write alternate language for XMP:Description, using HTML character)Tj
-T*
-( escaping to input special characters.)Tj
ET
endstream
endobj
@@ -14467,7 +14483,7 @@ endobj
endobj
115 0 obj
<<
-/Length 4027
+/Length 4111
>>
stream
BT
@@ -14477,9 +14493,23 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 36)Tj
+( -- ExifTool 12.74 -- 36)Tj
/TT4 1 Tf
-0 -2.7333 TD
+0 -1.6333 TD
+( operator is used for conditional deletion \(see next example\).)Tj
+0 -2.2 TD
+( exiftool -credit-=xxx dir)Tj
+0 -1.1 TD
+( Delete Credit information from all files in a directory where the)Tj
+T*
+( Credit value was "xxx".)Tj
+0 -2.2 TD
+( exiftool -xmp:description-de='k&uuml;hl' -E dst.jpg)Tj
+0 -1.1 TD
+( Write alternate language for XMP:Description, using HTML character)Tj
+T*
+( escaping to input special characters.)Tj
+0 -2.2 TD
( exiftool -all= dst.jpg)Tj
0 -1.1 TD
( Delete all meta information from an image. Note: You should NOT)Tj
@@ -14573,18 +14603,6 @@ T*
( Set "WhiteBalance" to "Tungsten" only if it was previously "Auto".)Tj
0 -2.2 TD
( exiftool -comment-= -comment='new comment' a.jpg)Tj
-0 -1.1 TD
-( Write a new comment only if the image doesn't have one already.)Tj
-0 -2.2 TD
-( exiftool -o %d%f.xmp dir)Tj
-0 -1.1 TD
-( Create XMP meta information data files for all images in "dir".)Tj
-0 -2.2 TD
-( exiftool -o test.xmp -owner=Phil -title='XMP File')Tj
-0 -1.1 TD
-( Create an XMP data file only from tags defined on the command)Tj
-T*
-( line.)Tj
ET
endstream
endobj
@@ -14602,7 +14620,7 @@ endobj
endobj
118 0 obj
<<
-/Length 4801
+/Length 4428
>>
stream
BT
@@ -14612,9 +14630,21 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 37)Tj
+( -- ExifTool 12.74 -- 37)Tj
/TT4 1 Tf
0 -1.6333 TD
+( Write a new comment only if the image doesn't have one already.)Tj
+0 -2.2 TD
+( exiftool -o %d%f.xmp dir)Tj
+0 -1.1 TD
+( Create XMP meta information data files for all images in "dir".)Tj
+0 -2.2 TD
+( exiftool -o test.xmp -owner=Phil -title='XMP File')Tj
+0 -1.1 TD
+( Create an XMP data file only from tags defined on the command)Tj
+T*
+( line.)Tj
+0 -2.2 TD
( exiftool '-ICC_Profile<=%d%f.icc' image.jpg)Tj
0 -1.1 TD
( Write ICC_Profile to an image from a ".icc" file of the same name.)Tj
@@ -14742,7 +14772,36 @@ T*
( Copy only the EXIF information from one image to another,)Tj
T*
( excluding SubIFD tags.)Tj
-0 -2.2 TD
+ET
+endstream
+endobj
+119 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+121 0 obj
+<<
+/Length 5455
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 38)Tj
+/TT4 1 Tf
+0 -2.7333 TD
( exiftool '-FileModifyDate<DateTimeOriginal' dir)Tj
0 -1.1 TD
( Use the original date from the meta information to set the same)Tj
@@ -14782,36 +14841,7 @@ T*
( exiftool -TagsFromFile src.jpg '-xmp:all<all' dst.jpg)Tj
0 -1.1 TD
( Copy all possible information from "src.jpg" and write in XMP)Tj
-ET
-endstream
-endobj
-119 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-121 0 obj
-<<
-/Length 5517
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 38)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+T*
( format to "dst.jpg".)Tj
0 -2.2 TD
( exiftool '-Description<${FileName;s/\\.[^.]*$//}' dir)Tj
@@ -15005,32 +15035,6 @@ T*
(ES)Tj
0.6 0 TD
(S)Tj
--9.6 -1.1 TD
-( By writing the "FileName" and "Directory" tags, files are renamed)Tj
-T*
-( and/or moved to new directories. This can be particularly useful and)Tj
-T*
-( powerful for organizing files by date when combined with the -)Tj
-40.8 0 TD
-(-d)Tj
-0.6 0 TD
-(d option.)Tj
--41.4 -1.1 TD
-( New directories are created as necessary, but existing files will not)Tj
-T*
-( be overwritten. The format codes %d, %f and %e may be used in the new)Tj
-T*
-( file name to represent the directory, name and extension of the)Tj
-T*
-( original file, and %c may be used to add a copy number if the file)Tj
-T*
-( already exists \(see the -)Tj
-18.6 0 TD
-(-w)Tj
-0.6 0 TD
-(w option for details\). Note that if used)Tj
--19.2 -1.1 TD
-( within a date format string, an extra '%' must be added to pass these)Tj
ET
endstream
endobj
@@ -15048,7 +15052,7 @@ endobj
endobj
124 0 obj
<<
-/Length 4907
+/Length 5259
>>
stream
BT
@@ -15058,11 +15062,37 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 39)Tj
+( -- ExifTool 12.74 -- 39)Tj
/TT4 1 Tf
0 -1.6333 TD
-( codes through the date/time parser. \(And further note that in a)Tj
+( By writing the "FileName" and "Directory" tags, files are renamed)Tj
0 -1.1 TD
+( and/or moved to new directories. This can be particularly useful and)Tj
+T*
+( powerful for organizing files by date when combined with the -)Tj
+40.8 0 TD
+(-d)Tj
+0.6 0 TD
+(d option.)Tj
+-41.4 -1.1 TD
+( New directories are created as necessary, but existing files will not)Tj
+T*
+( be overwritten. The format codes %d, %f and %e may be used in the new)Tj
+T*
+( file name to represent the directory, name and extension of the)Tj
+T*
+( original file, and %c may be used to add a copy number if the file)Tj
+T*
+( already exists \(see the -)Tj
+18.6 0 TD
+(-w)Tj
+0.6 0 TD
+(w option for details\). Note that if used)Tj
+-19.2 -1.1 TD
+( within a date format string, an extra '%' must be added to pass these)Tj
+T*
+( codes through the date/time parser. \(And further note that in a)Tj
+T*
( Windows batch file, all '%' characters must also be escaped, so in this)Tj
T*
( extreme case '%%%%f' is necessary to pass a simple '%f' through the two)Tj
@@ -15212,18 +15242,6 @@ T*
( log \("track.log"\). Since the "Geotime" tag is not specified, the)Tj
T*
( value of DateTimeOriginal is used for geotagging. Local system)Tj
-T*
-( time is assumed unless DateTimeOriginal contains a timezone.)Tj
-0 -2.2 TD
-( exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg)Tj
-0 -1.1 TD
-( Geotag an image with the GPS position for a specific time.)Tj
-0 -2.2 TD
-( exiftool -geotag log.gpx '-xmp:geotime<createdate' dir)Tj
-0 -1.1 TD
-( Geotag all images in directory "dir" with XMP tags instead of EXIF)Tj
-T*
-( tags, based on the image CreateDate.)Tj
ET
endstream
endobj
@@ -15241,7 +15259,7 @@ endobj
endobj
127 0 obj
<<
-/Length 4698
+/Length 4222
>>
stream
BT
@@ -15251,9 +15269,21 @@ BT
/GS1 gs
0 Tc
0 Tw
-( -- ExifTool 12.73 -- 40)Tj
+( -- ExifTool 12.74 -- 40)Tj
/TT4 1 Tf
0 -1.6333 TD
+( time is assumed unless DateTimeOriginal contains a timezone.)Tj
+0 -2.2 TD
+( exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg)Tj
+0 -1.1 TD
+( Geotag an image with the GPS position for a specific time.)Tj
+0 -2.2 TD
+( exiftool -geotag log.gpx '-xmp:geotime<createdate' dir)Tj
+0 -1.1 TD
+( Geotag all images in directory "dir" with XMP tags instead of EXIF)Tj
+T*
+( tags, based on the image CreateDate.)Tj
+0 -2.2 TD
( exiftool -geotag a.log -geosync=-20 dir)Tj
0 -1.1 TD
( Geotag images in directory "dir", accounting for image timestamps)Tj
@@ -15385,7 +15415,36 @@ T*
( want to do this I don't know, but I've included this as an example)Tj
T*
( to illustrate the flexibility of ExifTool.\))Tj
-0 -2.2 TD
+ET
+endstream
+endobj
+128 0 obj
+<<
+/ProcSet [/PDF /Text ]
+/Font <<
+/TT2 4 0 R
+/TT4 5 0 R
+>>
+/ExtGState <<
+/GS1 6 0 R
+>>
+>>
+endobj
+130 0 obj
+<<
+/Length 3139
+>>
+stream
+BT
+/TT2 1 Tf
+10 0 0 10 29 806.3333 Tm
+0 g
+/GS1 gs
+0 Tc
+0 Tw
+( -- ExifTool 12.74 -- 41)Tj
+/TT4 1 Tf
+0 -1.6333 TD
(I)Tj
0 0 TD
(IN)Tj
@@ -15461,36 +15520,7 @@ T*
(S)Tj
-6 -1.1 TD
( The exiftool application exits with a status of 0 on success, or 1 if)Tj
-ET
-endstream
-endobj
-128 0 obj
-<<
-/ProcSet [/PDF /Text ]
-/Font <<
-/TT2 4 0 R
-/TT4 5 0 R
->>
-/ExtGState <<
-/GS1 6 0 R
->>
->>
-endobj
-130 0 obj
-<<
-/Length 2186
->>
-stream
-BT
-/TT2 1 Tf
-10 0 0 10 29 806.3333 Tm
-0 g
-/GS1 gs
-0 Tc
-0 Tw
-( -- ExifTool 12.73 -- 41)Tj
-/TT4 1 Tf
-0 -1.6333 TD
+T*
( an error occurred, or 2 if all files failed the -)Tj
33 0 TD
(-i)Tj
@@ -15689,7 +15719,7 @@ BT
0.6 0 TD
(s\(3pm\), Image::ExifTool::Shift.pl)Tj
-19.2 -4.4 TD
-(perl v5.18.4 2024-01-10 EXIFTOOL\(1\))Tj
+(perl v5.18.4 2024-01-22 EXIFTOOL\(1\))Tj
ET
endstream
endobj
@@ -16173,8 +16203,8 @@ endobj
endobj
137 0 obj
<<
-/CreationDate (D:20240110140142-05'00')
-/ModDate (D:20240110140142-05'00')
+/CreationDate (D:20240123091134-05'00')
+/ModDate (D:20240123091134-05'00')
/Producer (Apple pstopdf)
>>
endobj
@@ -16188,151 +16218,151 @@ endobj
xref
0 139
0000000000 65535 f
-0000272826 00000 n
+0000273672 00000 n
0000000016 00000 n
0000007980 00000 n
-0000271837 00000 n
-0000272226 00000 n
-0000271302 00000 n
-0000276368 00000 n
-0000272906 00000 n
+0000272683 00000 n
+0000273072 00000 n
+0000272148 00000 n
+0000277214 00000 n
+0000273752 00000 n
0000008086 00000 n
0000013537 00000 n
-0000272987 00000 n
+0000273833 00000 n
0000013644 00000 n
0000019108 00000 n
-0000273070 00000 n
+0000273916 00000 n
0000019215 00000 n
0000025098 00000 n
-0000273153 00000 n
+0000273999 00000 n
0000025205 00000 n
0000031661 00000 n
-0000273236 00000 n
+0000274082 00000 n
0000031768 00000 n
0000038624 00000 n
-0000273319 00000 n
+0000274165 00000 n
0000038731 00000 n
0000046761 00000 n
-0000273402 00000 n
+0000274248 00000 n
0000046868 00000 n
0000053180 00000 n
-0000273485 00000 n
+0000274331 00000 n
0000053287 00000 n
0000060280 00000 n
-0000273568 00000 n
+0000274414 00000 n
0000060387 00000 n
0000066945 00000 n
-0000273651 00000 n
+0000274497 00000 n
0000067052 00000 n
0000073445 00000 n
-0000277003 00000 n
-0000276503 00000 n
-0000273735 00000 n
+0000277849 00000 n
+0000277349 00000 n
+0000274581 00000 n
0000073552 00000 n
0000082719 00000 n
-0000273819 00000 n
+0000274665 00000 n
0000082826 00000 n
0000091018 00000 n
-0000273903 00000 n
+0000274749 00000 n
0000091125 00000 n
0000095910 00000 n
-0000273987 00000 n
+0000274833 00000 n
0000096017 00000 n
-0000101448 00000 n
-0000274071 00000 n
-0000101555 00000 n
-0000109372 00000 n
-0000274155 00000 n
-0000109479 00000 n
-0000116858 00000 n
-0000274239 00000 n
-0000116965 00000 n
-0000121556 00000 n
-0000274323 00000 n
-0000121663 00000 n
-0000127632 00000 n
-0000274407 00000 n
-0000127739 00000 n
-0000136393 00000 n
-0000274491 00000 n
-0000136500 00000 n
-0000144234 00000 n
-0000276641 00000 n
-0000274575 00000 n
-0000144341 00000 n
-0000152115 00000 n
-0000274659 00000 n
-0000152222 00000 n
-0000159002 00000 n
-0000274743 00000 n
-0000159109 00000 n
-0000167727 00000 n
-0000274827 00000 n
-0000167834 00000 n
-0000174881 00000 n
-0000274911 00000 n
-0000174988 00000 n
-0000183565 00000 n
-0000274995 00000 n
-0000183672 00000 n
-0000189756 00000 n
-0000275079 00000 n
-0000189863 00000 n
-0000196801 00000 n
-0000275163 00000 n
-0000196908 00000 n
-0000206872 00000 n
-0000275247 00000 n
-0000206979 00000 n
-0000214854 00000 n
-0000275331 00000 n
-0000214961 00000 n
-0000223160 00000 n
-0000276779 00000 n
-0000275417 00000 n
-0000223268 00000 n
-0000227513 00000 n
+0000101475 00000 n
+0000274917 00000 n
+0000101582 00000 n
+0000109144 00000 n
+0000275001 00000 n
+0000109251 00000 n
+0000117124 00000 n
+0000275085 00000 n
+0000117231 00000 n
+0000121721 00000 n
+0000275169 00000 n
+0000121828 00000 n
+0000127636 00000 n
+0000275253 00000 n
+0000127743 00000 n
+0000136668 00000 n
+0000275337 00000 n
+0000136775 00000 n
+0000143944 00000 n
+0000277487 00000 n
+0000275421 00000 n
+0000144051 00000 n
+0000152018 00000 n
0000275505 00000 n
-0000227621 00000 n
-0000234129 00000 n
-0000275593 00000 n
-0000234237 00000 n
-0000239605 00000 n
-0000275681 00000 n
-0000239713 00000 n
-0000244086 00000 n
-0000275769 00000 n
-0000244194 00000 n
-0000248275 00000 n
-0000275857 00000 n
-0000248383 00000 n
-0000253238 00000 n
-0000275945 00000 n
-0000253346 00000 n
-0000258917 00000 n
-0000276033 00000 n
-0000259025 00000 n
-0000263986 00000 n
-0000276121 00000 n
-0000264094 00000 n
-0000268846 00000 n
-0000276209 00000 n
-0000268954 00000 n
-0000271194 00000 n
-0000276927 00000 n
-0000271442 00000 n
-0000271645 00000 n
-0000276297 00000 n
-0000276326 00000 n
-0000277117 00000 n
-0000277241 00000 n
+0000152125 00000 n
+0000158934 00000 n
+0000275589 00000 n
+0000159041 00000 n
+0000167647 00000 n
+0000275673 00000 n
+0000167754 00000 n
+0000175198 00000 n
+0000275757 00000 n
+0000175305 00000 n
+0000183538 00000 n
+0000275841 00000 n
+0000183645 00000 n
+0000190092 00000 n
+0000275925 00000 n
+0000190199 00000 n
+0000196866 00000 n
+0000276009 00000 n
+0000196973 00000 n
+0000206390 00000 n
+0000276093 00000 n
+0000206497 00000 n
+0000214647 00000 n
+0000276177 00000 n
+0000214754 00000 n
+0000222815 00000 n
+0000277625 00000 n
+0000276263 00000 n
+0000222923 00000 n
+0000228009 00000 n
+0000276351 00000 n
+0000228117 00000 n
+0000233785 00000 n
+0000276439 00000 n
+0000233893 00000 n
+0000239990 00000 n
+0000276527 00000 n
+0000240098 00000 n
+0000244454 00000 n
+0000276615 00000 n
+0000244562 00000 n
+0000248727 00000 n
+0000276703 00000 n
+0000248835 00000 n
+0000253317 00000 n
+0000276791 00000 n
+0000253425 00000 n
+0000258934 00000 n
+0000276879 00000 n
+0000259042 00000 n
+0000264355 00000 n
+0000276967 00000 n
+0000264463 00000 n
+0000268739 00000 n
+0000277055 00000 n
+0000268847 00000 n
+0000272040 00000 n
+0000277773 00000 n
+0000272288 00000 n
+0000272491 00000 n
+0000277143 00000 n
+0000277172 00000 n
+0000277963 00000 n
+0000278087 00000 n
trailer
<<
/Size 139
/Root 138 0 R
/Info 137 0 R
-/ID [<844db97969f28a4c2424cc2cce5af375><844db97969f28a4c2424cc2cce5af375>]
+/ID [<3aa2959fee1af35a2b0eb14e5adb670e><3aa2959fee1af35a2b0eb14e5adb670e>]
>>
startxref
-277313
+278159
%%EOF
diff --git a/html/faq.html b/html/faq.html
index 3c8620f3..3ab9b2f9 100644
--- a/html/faq.html
+++ b/html/faq.html
@@ -783,8 +783,8 @@ Nikon.jpg - 100
OlympusE1.jpg Auto 400
</pre>
-One limitation of the <code>-T</code> option is that a list of tags to extract
-must be specified. Otherwise, all information is extracted from each input
+One limitation of the <code>-T</code> option is that you must specify a list
+of tags to extract. Otherwise, all information is extracted from each input
file, and the columns would contain values from random tags.</blockquote>
<blockquote> The <code>-csv</code> (comma separated values) option solves this
@@ -792,7 +792,8 @@ dilemma by pre-extracting information from all input files, then producing a
sorted list of available tag names as the first row of the output, and
organizing the information into columns for each tag. As well, a first column
labelled "SourceFile" is generated. These features make it practical to use the
-<code>-csv</code> option for extracting all information from multiple images.
+<code>-csv</code> option for extracting all information from multiple images
+(but impractical for a large number of images due to memory restrictions).
For example, this command:
<pre>exiftool -csv -r t/images > out.csv</pre>
@@ -1821,7 +1822,7 @@ default values if necessary).
</blockquote>
<hr>
-<i>Last revised Dec 24, 2023</i>
+<i>Last revised Jan 20, 2024</i>
<p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
</body>
</html>
diff --git a/html/filename.html b/html/filename.html
index 64df7b4e..baea7331 100644
--- a/html/filename.html
+++ b/html/filename.html
@@ -358,13 +358,14 @@ with these name format codes.</p>
<ol>
<li>The <code>%f</code> format code is an ExifTool-specific enhancement and
supports an optional number of digits after the decimal point. For example,
-<code>%3f</code> gives fractional seconds with 3 digits (eg. ".123"). A
-"<code>-</code>" may be added to drop the decimal (eg. <code>%-3f</code> would
-give "123"). The value is rounded to the specified number of digits, and the
-date/time value is incremented by one second if the rounding would overflow to
-the next second, even if the number of decimal digits is zero (ie.
-<code>%0f</code>). Without <code>%f</code>, the fractional seconds are simply
-discarded and no rounding is performed.<br><br></li>
+<code>%3f</code> gives fractional seconds with 3 digits (eg. ".123").
+<code>%f</code> alone returns an empty string if the date/time contains no
+subseconds. A "<code>-</code>" may be added to drop the decimal (eg.
+<code>%-3f</code> would give "123"). The value is rounded to the specified
+number of digits, and the date/time value is incremented by one second if the
+rounding would overflow to the next second, even if the number of decimal digits
+is zero (ie. <code>%0f</code>). Without <code>%f</code>, the fractional seconds
+are simply discarded and no rounding is performed.<br><br></li>
<li>The <code>%s</code> and <code>%z</code> format codes use the time zone
specified by the date/time value. If the date/time value does not include a
time zone specification, then it is interpreted as a local time in the system
diff --git a/html/history.html b/html/history.html
index 9ababb41..6426af20 100644
--- a/html/history.html
+++ b/html/history.html
@@ -17,6 +17,33 @@ considered development releases, and are not uploaded to <a href="https://metacp
<!-- Use line width of 80 -->
<!-- *********************************************************************** -->
+<a name='v12.74'><b>Jan. 23, 2024 - Version 12.74</b></a>
+<ul>
+<li>Added a couple of new Nikon lenses (thanks Chris)
+<li>Added write support for a few new QuickTime Keys tags
+<li>Decode ShutterCount for Canon EOS R5 (thanks John Moyer)
+<li>Improved error messages in the case of file read errors
+<li>Enhanced tag name strings (eg. -if option expressions) to allow values of
+ multiple matching tags to be concatenated when a group name of "All" is
+ specified
+<li>Enhanced -p option to add -p- feature which avoids adding trailing newline
+<li>Changed warning from "Shift results in negative time" to "Shift results in
+ date before 1970"
+<li>Patched calculation of GPSDateTime for the timed metadata in Track3 of
+ Garmin videos so the API QuickTimeUTC option is no longer required
+<li>Fixed conversion error when writing QuickTime:GoogleTrackDuration
+<li>Fixed misidentification of non-TIFF-format files containing DNGVersion tag
+<li>Fixed bug where Avoid-ed XMP structures could be created when writing
+ another same-named structure
+<li>Internal Changes:
+ <ul>
+ <li>Changed form of all new() calls to accommodate backward
+ incompatibilities in recent versions of Perl
+ <li>Changed order of InsertTagValues() arguments
+ <li>DateFmt() now returns value of formatted date/time string
+ </ul>
+</ul>
+
<a name='v12.73'><b>Jan. 10, 2024 - Version 12.73</b></a>
<ul>
<li>Added write support for Leica XMP-xmpDSA tags
@@ -33,7 +60,8 @@ considered development releases, and are not uploaded to <a href="https://metacp
<li>Fixed writing of date/time tags in XMP-xmpMM:Pantry structure
<li>API Changes:
<ul>
- <li>Added <a href="ExifTool.html#LimitLongValues">LimitLongValues option</a>
+ <li>Added <a href="ExifTool.html#LimitLongValues">LimitLongValues option</a> to provide control over tags which
+ previously had a hard-coded length limit
</ul>
</ul>
diff --git a/html/index.html b/html/index.html
index 68ab933e..c0a48d94 100644
--- a/html/index.html
+++ b/html/index.html
@@ -94,9 +94,9 @@ the site with a moderate load. An alternate ExifTool homepage is available at
</div>
<blockquote><table class='dl lg'><tr><td><b>
-<a href="http://sourceforge.net/projects/exiftool/files/Image-ExifTool-12.73.tar.gz/download">
-Download Version 12.73</a> (5.1 MB) -
-<a href="history.html">Jan. 10, 2024</a></b></td></tr></table></blockquote>
+<a href="http://sourceforge.net/projects/exiftool/files/Image-ExifTool-12.74.tar.gz/download">
+Download Version 12.74</a> (5.1 MB) -
+<a href="history.html">Jan. 23, 2024</a></b></td></tr></table></blockquote>
<p><b>ExifTool is a platform-independent <a href="ExifTool.html">Perl
library</a> plus a <a href="exiftool_pod.html">command-line application</a> for
@@ -149,8 +149,8 @@ distribution above.)</i></p>
<blockquote><table class='dl lg'><tr><td><b>
<a name="alone">Windows Executable:</a>
-<a href="http://sourceforge.net/projects/exiftool/files/exiftool-12.73.zip/download">
- exiftool-12.73.zip</a> (7.0 MB)</b></td></tr></table></blockquote>
+<a href="http://sourceforge.net/projects/exiftool/files/exiftool-12.74.zip/download">
+ exiftool-12.74.zip</a> (7.0 MB)</b></td></tr></table></blockquote>
<p><b>The stand-alone Windows executable</b> does not require Perl. Just
download and un-zip the archive then double-click on
@@ -168,7 +168,7 @@ if you have any problems/comments with this version.)</i></p>
<blockquote><table class='dl lg'><tr><td><b>
MacOS Package:
<a href="http://sourceforge.net/projects/exiftool/files/ExifTool-9.70.dmg/download">
- ExifTool-12.73.dmg</a> (3.3 MB)</b></td></tr></table></blockquote>
+ ExifTool-12.74.dmg</a> (3.3 MB)</b></td></tr></table></blockquote>
<p><b>The MacOS package</b> installs the ExifTool command-line application and
libraries in /usr/local/bin. After installing, type "<code>exiftool</code>" in a
diff --git a/html/install.html b/html/install.html
index 38333eef..312bdf75 100644
--- a/html/install.html
+++ b/html/install.html
@@ -52,10 +52,10 @@ documentation or some other files of the full distribution.</p>
<h3>Stand-Alone Executable</h3>
<ol>
<li><b>Download</b> the <b>Windows Executable</b> from the <a href="index.html">ExifTool home page</a>.
-<br><span class=lt>(The file you download should be named "<code>exiftool-12.73.zip</code>".)</span></li>
+<br><span class=lt>(The file you download should be named "<code>exiftool-12.74.zip</code>".)</span></li>
<li><b>Extract "<code>exiftool(-k).exe</code>"</b> from the
"<code>.zip</code>" file, and place it <b>on your Desktop</b>.
-<br><span class=lt>(Double-click on "<code>exiftool-12.73.zip</code>" to open
+<br><span class=lt>(Double-click on "<code>exiftool-12.74.zip</code>" to open
the archive, then drag "<code>exiftool(-k).exe</code>" to your Desktop.)</span></li>
</ol>
<p>You can now double-click on "<code>exiftool(-k).exe</code>" to read the
@@ -109,7 +109,7 @@ can be downloaded from
<a href="http://www.activestate.com/activeperl/">activeperl.com</a>.)</p>
<ol>
<li><b>Download</b> the <b>Image-ExifTool distribution</b> from the <a href="index.html">ExifTool home page</a>
-<br><span class=lt>(The file you download should be named "<code>Image-ExifTool-12.73.tar.gz</code>".)</span></li>
+<br><span class=lt>(The file you download should be named "<code>Image-ExifTool-12.74.tar.gz</code>".)</span></li>
<li><b>Extract the ExifTool files</b> from the archive.
<br><span class=lt>(The archive is a gzipped tar file, and can be opened with
various Windows utilities, including WinZip.)</span></li>
@@ -151,7 +151,7 @@ in the MacOS package. Both versions run natively on PPC and Intel Macs.</p>
<h3>MacOS Package</h3>
<ol>
<li><b>Download</b> the <b>ExifTool MacOS Package</b> from the <a href="index.html">ExifTool home page</a>.
-<br><span class=lt>(The file you download should be named "<code>ExifTool-12.73.dmg</code>".)</span></li>
+<br><span class=lt>(The file you download should be named "<code>ExifTool-12.74.dmg</code>".)</span></li>
<li><b>Install</b> as a normal <b>MacOS package</b>.
<br><span class=lt>(Open the disk image, double-click on the install package, and follow the instructions.
See the second item in the Notes section below if you are stopped with an "unidentified developer" message.)
@@ -167,12 +167,12 @@ See the second item in the Notes section below if you are stopped with an "unide
<ol>
<li><b>Download</b> the <b>Image-ExifTool distribution</b> from the <a href="index.html">ExifTool home page</a>
to your Desktop.
-<br><span class=lt>(The file you download should be named "<code>Image-ExifTool-12.73.tar.gz</code>".)</span></li>
+<br><span class=lt>(The file you download should be named "<code>Image-ExifTool-12.74.tar.gz</code>".)</span></li>
<li><b>Launch</b> the <b>Terminal</b> application from the Utilities folder in your Applications folder.</li>
<li>In the Terminal window, <b>type the following</b>:
<pre class='code'> cd ~/Desktop
- tar -xzf Image-ExifTool-12.73.tar.gz
- cd Image-ExifTool-12.73
+ tar -xzf Image-ExifTool-12.74.tar.gz
+ cd Image-ExifTool-12.74
sudo cp -r exiftool lib /usr/local/bin
</pre>
<span class=lt>(Note: The last step above will require you to enter your
@@ -188,7 +188,7 @@ your Perl version. If both sets of libraries exist, /usr/local/bin/lib takes
precedence for exiftool, but /Library/Perl/#.#.# is the default for any other
Perl scripts.</li>
<li>In MacOS 10.8 or later, you may see this message when you try to open the install package:
-<blockquote class=red>"ExifTool-12.73.pkg" can't be opened because it is from an
+<blockquote class=red>"ExifTool-12.74.pkg" can't be opened because it is from an
unidentified developer.</blockquote> The solution is to control-click on the pkg
then select "Open" from the pop-up menu instead of just double-clicking. An alternative
is to lower the security settings by changing "Allow applications downloaded from" to
@@ -215,11 +215,11 @@ have the wrong "<code>lib</code>" folder.</li>
<ol>
<li><b>Download</b> the <b>Image-ExifTool distribution</b> from the <a href="index.html">ExifTool home page</a>
-<br><span class=lt>(The file you download should be named "<code>Image-ExifTool-12.73.tar.gz</code>".)</span></li>
+<br><span class=lt>(The file you download should be named "<code>Image-ExifTool-12.74.tar.gz</code>".)</span></li>
<li><b>Unpack the distribution</b> and <b>make it your current directory</b> by typing:
<pre class='code'> cd <i>&lt;your download directory&gt;</i>
- gzip -dc Image-ExifTool-12.73.tar.gz | tar -xf -
- cd Image-ExifTool-12.73
+ gzip -dc Image-ExifTool-12.74.tar.gz | tar -xf -
+ cd Image-ExifTool-12.74
</pre>
<span class=lt>(At this point you may run exiftool by typing
"<code>./exiftool <i>&lt;image file name&gt;</i></code>".)</span></li>
diff --git a/html/models.html b/html/models.html
index 7e3d3204..3ccf4cd4 100644
--- a/html/models.html
+++ b/html/models.html
@@ -10,7 +10,7 @@
</style>
</head><body>
<h2 class='up'>ExifTool-tested Camera Models</h2>
-<p>Images from the following 7463 camera models have been tested with ExifTool.</p>
+<p>Images from the following 7465 camera models have been tested with ExifTool.</p>
<p>If you own a camera that doesn't appear here, please send me a sample
image so I can add it to this list. (The image must be straight out of the
camera and not modified by any image editor such as Photoshop. And to make
@@ -130,6 +130,7 @@ iPhone 13 Pro</td><td>
iPhone 13 Pro Max<br>
iPhone 14<br>
iPhone 14 Pro<br>
+iPhone 15 Plus<br>
iPhone SE<br>
iPhone X<br>
iPhone XR<br>
@@ -7313,6 +7314,7 @@ ILCE-7S<br>
ILCE-7SM2<br>
ILCE-7SM3<br>
ILCE-9<br>
+ILCE-9M3<br>
ILCE-3000<br>
ILCE-3500<br>
ILCE-5000<br>
@@ -7813,7 +7815,7 @@ Z667T<br>
Z797C<br>
Z970</td></tr>
</table></div><hr>
-<i>Last revised Jan 3, 2024</i>
+<i>Last revised Jan 16, 2024</i>
<p class='lf'><a href='index.html'>&lt;-- Back to ExifTool home page</a></p>
</body>
</html>
diff --git a/html/sample_images.html b/html/sample_images.html
index cc93d2ce..9cd1ce23 100644
--- a/html/sample_images.html
+++ b/html/sample_images.html
@@ -8,7 +8,7 @@
<body>
<h1 class='up'>ExifTool Meta Information Repository</h1>
<p>The following archives contain sample JPEG images with the original meta
-information from 7007 different models of digital cameras, DV recorders,
+information from 7009 different models of digital cameras, DV recorders,
scanners and cell phones from 106 manufacturers. To conserve space and avoid
copyright problems, the main image has been replaced, and the large preview
image (and any other information found after the JPEG EOI) has been removed.
@@ -34,10 +34,10 @@ repository as more suitable samples become available.</p>
<td align='right'>70 kB&nbsp;</td>
<td>&nbsp;<a href='Aiptek.tar.gz'>Aiptek.tar.gz</a></td>
<td align='center'>2010-08-30</td></tr>
-<tr><td>&nbsp;Apple</td><td align='center'>48</td>
-<td align='right'>388 kB&nbsp;</td>
+<tr><td>&nbsp;Apple</td><td align='center'>49</td>
+<td align='right'>391 kB&nbsp;</td>
<td>&nbsp;<a href='Apple.tar.gz'>Apple.tar.gz</a></td>
-<td align='center'>2023-06-14</td></tr>
+<td align='center'>2024-01-16</td></tr>
<tr><td>&nbsp;Asus</td><td align='center'>1</td>
<td align='right'>23 kB&nbsp;</td>
<td>&nbsp;<a href='Asus.tar.gz'>Asus.tar.gz</a></td>
@@ -370,10 +370,10 @@ repository as more suitable samples become available.</p>
<td align='right'>82 kB&nbsp;</td>
<td>&nbsp;<a href='Skanhex.tar.gz'>Skanhex.tar.gz</a></td>
<td align='center'>2011-06-07</td></tr>
-<tr><td>&nbsp;Sony</td><td align='center'>748</td>
+<tr><td>&nbsp;Sony</td><td align='center'>749</td>
<td align='right'>8.2 MB&nbsp;</td>
<td>&nbsp;<a href='Sony.tar.gz'>Sony.tar.gz</a></td>
-<td align='center'>2023-11-17</td></tr>
+<td align='center'>2024-01-16</td></tr>
<tr><td>&nbsp;Sony Ericsson</td><td align='center'>196</td>
<td align='right'>3.4 MB&nbsp;</td>
<td>&nbsp;<a href='SonyEricsson.tar.gz'>SonyEricsson.tar.gz</a></td>
@@ -446,12 +446,12 @@ repository as more suitable samples become available.</p>
<td align='right'>351 kB&nbsp;</td>
<td>&nbsp;<a href='ZTE.tar.gz'>ZTE.tar.gz</a></td>
<td align='center'>2015-07-27</td></tr>
-<tr bgcolor='#dddddd'><th>Total</th><td align='center'>7007 models</td>
+<tr bgcolor='#dddddd'><th>Total</th><td align='center'>7009 models</td>
<td align='right'>143.6 MB&nbsp;</td><td align='center'>106 makes</td>
-<td align='center'>2024-01-03</td></tr>
+<td align='center'>2024-01-16</td></tr>
</table></blockquote><hr>
<i>Created May 15, 2006</i><br>
-<i>Last revised Jan 3, 2024</i>
+<i>Last revised Jan 16, 2024</i>
<p class='lf'><a href='index.html'>&lt;-- Back to ExifTool home page</a></p>
</body>
</html>
diff --git a/lib/File/RandomAccess.pm b/lib/File/RandomAccess.pm
index 297aa6b5..b4e6da8d 100644
--- a/lib/File/RandomAccess.pm
+++ b/lib/File/RandomAccess.pm
@@ -17,6 +17,7 @@
# scalar with a multi-character newline
# 01/24/2009 - PH Protect against reading too much at once
# 10/04/2018 - PH Added NoBuffer option
+# 01/20/2024 - PH Set ERROR on file read error
#
# Notes: Calls the normal file i/o routines unless SeekTest() fails, in
# which case the file is buffered in memory to allow random access.
@@ -25,6 +26,9 @@
#
# May also be used for string i/o (just pass a scalar reference)
#
+# Sets internal ERROR member from $! if there is an error reading
+# the file.
+#
# Legal: Copyright (c) 2003-2024, 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.
@@ -37,7 +41,7 @@ require 5.002;
require Exporter;
use vars qw($VERSION @ISA @EXPORT_OK);
-$VERSION = '1.11';
+$VERSION = '1.12';
@ISA = qw(Exporter);
sub Read($$$);
@@ -211,6 +215,8 @@ sub Read($$$)
if ($num) {
${$self->{BUFF_PT}} .= $buff;
$self->{LEN} += $num;
+ } elsif (not defined $num) {
+ $self->{ERROR} = $!;
}
}
# number of bytes left in data buffer
@@ -229,7 +235,11 @@ sub Read($$$)
} else {
# read directly from file
$_[0] = '' unless defined $_[0];
- $rtnVal = read($self->{FILE_PT}, $_[0], $len) || 0;
+ $rtnVal = read($self->{FILE_PT}, $_[0], $len);
+ unless (defined $rtnVal) {
+ $self->{ERROR} = $!;
+ $rtnVal = 0;
+ }
}
if ($self->{DEBUG}) {
my $pos = $self->Tell() - $rtnVal;
@@ -258,7 +268,10 @@ sub ReadLine($$)
# make sure we have some data after the current position
while ($self->{LEN} <= $pos) {
$num = read($fp, $buff, $CHUNK_SIZE);
- return 0 unless $num;
+ unless ($num) {
+ defined $num or $self->{ERROR} = $!;
+ return 0;
+ }
${$self->{BUFF_PT}} .= $buff;
$self->{LEN} += $num;
}
@@ -270,7 +283,11 @@ sub ReadLine($$)
last;
}
$pos = $self->{LEN}; # have scanned to end of buffer
- $num = read($fp, $buff, $CHUNK_SIZE) or last;
+ $num = read($fp, $buff, $CHUNK_SIZE);
+ unless ($num) {
+ defined $num or $self->{ERROR} = $!;
+ last;
+ }
${$self->{BUFF_PT}} .= $buff;
$self->{LEN} += $num;
}
@@ -314,7 +331,12 @@ sub Slurp($)
my $fp = $self->{FILE_PT} || return;
# read whole file into buffer (in large chunks)
my ($buff, $num);
- while (($num = read($fp, $buff, $CHUNK_SIZE * $SLURP_CHUNKS)) != 0) {
+ for (;;) {
+ $num = read($fp, $buff, $CHUNK_SIZE * $SLURP_CHUNKS);
+ unless ($num) {
+ defined $num or $self->{ERROR} = $!;
+ last;
+ }
${$self->{BUFF_PT}} .= $buff;
$self->{LEN} += $num;
}
@@ -339,6 +361,10 @@ sub Purge($)
$self->{POS} -= $self->{LEN};
${$self->{BUFF_PT}} = '';
$self->{LEN} = read($self->{FILE_PT}, ${$self->{BUFF_PT}}, $SKIP_SIZE);
+ if (not defined $self->{LEN}) {
+ $self->{ERROR} = $!;
+ last;
+ }
last if $self->{LEN} < $SKIP_SIZE;
}
} elsif ($purge > 0) {
diff --git a/lib/File/RandomAccess.pod b/lib/File/RandomAccess.pod
index 5ccd53fe..25930b36 100644
--- a/lib/File/RandomAccess.pod
+++ b/lib/File/RandomAccess.pod
@@ -16,9 +16,9 @@ File::RandomAccess - Random access reads of sequential file or scalar
use File::RandomAccess;
- $raf = new File::RandomAccess(\*FILE, $disableSeekTest);
+ $raf = File::RandomAccess->new(\*FILE, $disableSeekTest);
- $raf = new File::RandomAccess(\$data);
+ $raf = File::RandomAccess->new(\$data);
$err = $raf->Seek($pos);
$num = $raf->Read($buff, $bytes);
@@ -38,10 +38,10 @@ Creates a new RandomAccess object given a file reference or
reference to data in memory.
# Read from open file or pipe
- $raf = new File::RandomAccess(\*FILE);
+ $raf = File::RandomAccess->new(\*FILE);
# Read from data in memory
- $raf = new File::RandomAccess(\$data);
+ $raf = File::RandomAccess->new(\$data);
=over 4
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm
index 1e4f591a..08c18a4a 100644
--- a/lib/Image/ExifTool.pm
+++ b/lib/Image/ExifTool.pm
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
%static_vars);
-$VERSION = '12.73';
+$VERSION = '12.74';
$RELEASE = '';
@ISA = qw(Exporter);
%EXPORT_TAGS = (
@@ -77,7 +77,7 @@ sub GetDeleteGroups();
sub AddUserDefinedTags($%);
sub SetAlternateFile($$$);
# non-public routines below
-sub InsertTagValues($$$;$$$);
+sub InsertTagValues($$;$$$$);
sub IsWritable($);
sub IsSameFile($$$);
sub IsRawType($);
@@ -2196,7 +2196,7 @@ sub new
# use Image::ExifTool 'ImageInfo';
# my $info = ImageInfo($file, 'DateTimeOriginal', 'ImageSize');
# - or -
-# my $et = new Image::ExifTool;
+# my $et = Image::ExifTool->new;
# my $info = $et->ImageInfo($file, \@tagList, {Sort=>'Group0'} );
sub ImageInfo($;@)
{
@@ -2206,7 +2206,7 @@ sub ImageInfo($;@)
if (ref $_[0] and UNIVERSAL::isa($_[0],'Image::ExifTool')) {
$self = shift;
} else {
- $self = new Image::ExifTool;
+ $self = Image::ExifTool->new;
}
my %saveOptions = %{$$self{OPTIONS}}; # save original options
@@ -2529,7 +2529,7 @@ sub ExtractInfo($;@)
FILE_TYPE => $$self{FILE_TYPE},
};
$saveOrder = GetByteOrder(),
- $$self{RAF} = new File::RandomAccess($_[0]);
+ $$self{RAF} = File::RandomAccess->new($_[0]);
$$self{PROCESSED} = { };
delete $$self{EXIF_DATA};
delete $$self{EXIF_POS};
@@ -2636,7 +2636,7 @@ sub ExtractInfo($;@)
# open the file
if ($self->Open(\*EXIFTOOL_FILE, $filename)) {
# create random access file object
- $raf = new File::RandomAccess(\*EXIFTOOL_FILE);
+ $raf = File::RandomAccess->new(\*EXIFTOOL_FILE);
# patch to force pipe to be buffered because seek returns success
# in Windows cmd shell pipe even though it really failed
$$raf{TESTED} = -1 if $filename eq '-' or $filename =~ /\|$/;
@@ -2767,12 +2767,16 @@ sub ExtractInfo($;@)
$raf->BinMode(); # set binary mode before we start reading
my $pos = $raf->Tell(); # get file position so we can rewind
# loop through list of file types to test
- my ($buff, $seekErr);
+ my ($buff, $err);
my %dirInfo = ( RAF => $raf, Base => $pos, TestBuff => \$buff );
# read start of file for testing
- $raf->Read($buff, $testLen) or $buff = '';
- $raf->Seek($pos, 0) or $seekErr = 1;
- until ($seekErr) {
+ if ($raf->Read($buff, $testLen)) {
+ $raf->Seek($pos, 0) or $err = 'Error seeking in file';
+ } else {
+ $err = $$raf{ERROR};
+ $buff = '';
+ }
+ until ($err) {
my $unkHeader;
$type = shift @fileTypeList;
if ($type) {
@@ -2795,7 +2799,7 @@ sub ExtractInfo($;@)
$type = ($1 eq "\xff\xd8\xff") ? 'JPEG' : 'TIFF';
my $skip = pos($buff) - length($1);
$dirInfo{Base} = $pos + $skip;
- $raf->Seek($pos + $skip, 0) or $seekErr = 1, last;
+ $raf->Seek($pos + $skip, 0) or $err = 'Error seeking in file', last;
$self->Warn("Processing $type-like data after unknown $skip-byte header");
$unkHeader = 1 unless $$self{DOC_NUM};
}
@@ -2841,14 +2845,13 @@ sub ExtractInfo($;@)
last;
}
# seek back to try again from the same position in the file
- $raf->Seek($pos, 0) or $seekErr = 1, last;
+ $raf->Seek($pos, 0) or $err = 'Error seeking in file';
}
- if (not defined $type and not $$self{DOC_NUM}) {
+ if (not $err and not defined $type and not $$self{DOC_NUM}) {
# if we were given a single image with a known type there
# must be a format error since we couldn't read it, otherwise
# it is likely we don't support images of this type
my $fileType = GetFileType($realname) || '';
- my $err;
if (not length $buff) {
$err = 'File is empty';
} else {
@@ -2889,10 +2892,9 @@ sub ExtractInfo($;@)
}
}
}
- $self->Error($err);
}
- if ($seekErr) {
- $self->Error('Error seeking in file');
+ if ($err) {
+ $self->Error($err);
} elsif ($self->Options('ScanForXMP') and (not defined $type or
(not $fast and not $$self{FoundXMP})))
{
@@ -4114,7 +4116,7 @@ sub Init($)
$$self{FileType} = ''; # identified file type
if ($self->Options('HtmlDump')) {
require Image::ExifTool::HtmlDump;
- $$self{HTML_DUMP} = new Image::ExifTool::HtmlDump;
+ $$self{HTML_DUMP} = Image::ExifTool::HtmlDump->new;
}
# make sure our TextOut is a file reference
$$self{OPTIONS}{TextOut} = \*STDOUT unless ref $$self{OPTIONS}{TextOut};
@@ -4177,7 +4179,7 @@ sub ExtractAltInfo($)
# (eg. -file1 '$originalfilename')
if ($fileName =~ /\$/) {
my @tags = reverse sort keys %{$$self{VALUE}};
- $fileName = $self->InsertTagValues(\@tags, $fileName, 'Warn');
+ $fileName = $self->InsertTagValues($fileName, \@tags, 'Warn');
next unless defined $fileName;
}
$altExifTool->ExtractInfo($fileName);
@@ -4504,7 +4506,7 @@ sub GetFileTime($$)
$atime = $mtime = $ctime = pack 'LL', 0, 0;
unless ($k32GetFileTime) {
return () if defined $k32GetFileTime;
- $k32GetFileTime = new Win32::API('KERNEL32', 'GetFileTime', 'NPPP', 'I');
+ $k32GetFileTime = Win32::API->new('KERNEL32', 'GetFileTime', 'NPPP', 'I');
unless ($k32GetFileTime) {
$self->Warn('Error calling Win32::API::GetFileTime');
$k32GetFileTime = 0;
@@ -4583,7 +4585,7 @@ sub ParseArguments($;@)
my $buff = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$arg)) : Encode::encode('utf8',$$arg);
$arg = \$buff;
}
- $$self{RAF} = new File::RandomAccess($arg);
+ $$self{RAF} = File::RandomAccess->new($arg);
# set filename to empty string to indicate that
# we have a file but we didn't open it
$$self{FILENAME} = '';
@@ -6981,7 +6983,7 @@ sub ProcessJPEG($$)
} elsif ($$segDataPt =~ /^(II|MM).{4}HEAPJPGM/s) {
next if $fast > 1; # skip processing for very fast
$dumpType = 'CIFF';
- my %dirInfo = ( RAF => new File::RandomAccess($segDataPt) );
+ my %dirInfo = ( RAF => File::RandomAccess->new($segDataPt) );
$$self{SET_GROUP1} = 'CIFF';
push @{$$self{PATH}}, 'CIFF';
require Image::ExifTool::CanonRaw;
@@ -7506,6 +7508,8 @@ sub ProcessJPEG($$)
} elsif ($$segDataPt =~ /^AROT\0/ and $length > 10) {
# iPhone "AROT" segment containing integrated intensity per 16 scan lines
# (with number of elements N = ImageHeight / 16 - 1, ref PH/NealKrawetz)
+ # "Absolute ROTational difference between two frames"
+ # (see https://www.hackerfactor.com/blog/index.php?/archives/822-Apple-Rot.html)
$xtra = 'segment (N=' . unpack('x6N', $$segDataPt) . ')';
}
} elsif ($marker == 0xeb) { # APP11 (JPEG-HDR, JUMBF)
@@ -8005,7 +8009,7 @@ sub DoProcessTIFF($$;$)
}
}
# update FileType if necessary now that we know more about the file
- if ($$self{DNGVersion} and $$self{FileType} !~ /^(DNG|GPR)$/) {
+ if ($$self{DNGVersion} and $$self{FILE_TYPE} eq 'TIFF' and $$self{FileType} !~ /^(DNG|GPR)$/) {
# override whatever FileType we set since we now know it is DNG
$self->OverrideFileType($$self{TIFF_TYPE} = 'DNG');
}
diff --git a/lib/Image/ExifTool.pod b/lib/Image/ExifTool.pod
index b4851038..153e4a46 100644
--- a/lib/Image/ExifTool.pod
+++ b/lib/Image/ExifTool.pod
@@ -619,7 +619,8 @@ DateFormat of "%Y:%m:%d %H:%M:%S").
=item Duplicates
Flag to return values from tags with duplicate names when extracting
-information. Default is 1.
+information. Default is 1. Forced to 1 when copying tags with
+L</SetNewValuesFromFile>.
=item Escape
@@ -824,11 +825,11 @@ Default is undef.
=item LimitLongValues
-When extracting some values that may be very long, the PrintConv values are
-length-limited and the value is truncated with an elipsis ("[...]") if it
-exceeds a specified length. This option specifies the length limit for
-these tags. A setting of 4 or less disables the limit (because the elipsis
-string is longer than this). Default is 60.
+When extracting values for some specific tags (usually Unknown tags), the
+PrintConv values are length-limited and the value is truncated with an
+ellipsis ("[...]") if it exceeds a specified length. This option specifies
+the length limit for these tags. A setting of 4 or less disables the limit
+(because the ellipsis string is longer than this). Default is 60.
=item ListItem
diff --git a/lib/Image/ExifTool/7Z.pm b/lib/Image/ExifTool/7Z.pm
index 1b8d0bc9..0a048cd5 100644
--- a/lib/Image/ExifTool/7Z.pm
+++ b/lib/Image/ExifTool/7Z.pm
@@ -15,7 +15,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.00';
+$VERSION = '1.01';
sub ReadUInt32 {
my $buff;
@@ -569,7 +569,7 @@ sub ReadFilesInfo {
next;
}
$_[0]->Read($buff, $size);
- my $buffer = new File::RandomAccess(\$buff);
+ my $buffer = File::RandomAccess->new(\$buff);
if($prop == 14){ # empty stream
my @isempty = ReadBoolean($buffer, $numfiles, 0);
my $numemptystreams = 0;
@@ -732,7 +732,7 @@ sub Process7Z($$)
$folder_data .= Decompress($et, $raf, $decomporessor, $remaining);
$remaining = $uncompressed_size - length($folder_data);
}
- $buffer2 = new File::RandomAccess(\$folder_data);
+ $buffer2 = File::RandomAccess->new(\$folder_data);
}
$buffer2->Seek(0, 0);
$buffer2->Read($buff, 1);
diff --git a/lib/Image/ExifTool/AFCP.pm b/lib/Image/ExifTool/AFCP.pm
index 1a8aa24c..d2de0f39 100644
--- a/lib/Image/ExifTool/AFCP.pm
+++ b/lib/Image/ExifTool/AFCP.pm
@@ -14,7 +14,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.08';
+$VERSION = '1.09';
sub ProcessAFCP($$);
@@ -134,7 +134,7 @@ NoAFCP: for (;;) {
$dirBuff = $valBuff = '';
require Image::ExifTool::Fixup;
$fixup = $$dirInfo{Fixup};
- $fixup or $fixup = $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
+ $fixup or $fixup = $$dirInfo{Fixup} = Image::ExifTool::Fixup->new;
$vers = substr($buff, 4, 2); # get version number
} else {
$et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
diff --git a/lib/Image/ExifTool/BZZ.pm b/lib/Image/ExifTool/BZZ.pm
index 3bbb59c5..fd06fdc8 100644
--- a/lib/Image/ExifTool/BZZ.pm
+++ b/lib/Image/ExifTool/BZZ.pm
@@ -19,7 +19,7 @@ use integer; # IMPORTANT!! use integer arithmetic throughout
require Exporter;
use vars qw($VERSION @ISA @EXPORT_OK);
-$VERSION = '1.00';
+$VERSION = '1.01';
@ISA = qw(Exporter);
@EXPORT_OK = qw(Decode);
@@ -196,7 +196,7 @@ sub Decode($;$)
if (ref $_[0] and UNIVERSAL::isa($_[0],'Image::ExifTool::BZZ')) {
$self = shift;
} else {
- $self = new Image::ExifTool::BZZ;
+ $self = Image::ExifTool::BZZ->new;
}
my $dataPt = shift;
if ($dataPt) {
diff --git a/lib/Image/ExifTool/BuildTagLookup.pm b/lib/Image/ExifTool/BuildTagLookup.pm
index 4b348d83..f813853a 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.52';
+$VERSION = '3.53';
@ISA = qw(Exporter);
sub NumbersFirst($$);
@@ -797,7 +797,7 @@ sub new
}
my $tableNum = 0;
- my $et = new Image::ExifTool;
+ my $et = Image::ExifTool->new;
my ($tableName, $tag);
# create lookup for short table names
foreach $tableName (@tableNames) {
@@ -1727,12 +1727,12 @@ sub WriteTagLookup($$)
}
#------------------------------------------------------------------------------
-# Sort numbers first numerically, then strings alphabetically (case insensitive)
+# Sort numbers first numerically, then strings alphabetically
+# - case-insensitive sorting set by global variable $caseInsensitive
# - two global variables are used to change the sort algorithm:
# $numbersFirst: -1 = put numbers after other strings
# 1 = put numbers before other strings
# 2 = put numbers first, but negative numbers last
-# $caseInsensitive: flag set for case-insensitive sorting
sub NumbersFirst($$)
{
my ($a, $b) = @_;
@@ -2742,7 +2742,7 @@ validation and consistency checks on the tag tables.
use Image::ExifTool::BuildTagLookup;
- $builder = new Image::ExifTool::BuildTagLookup;
+ $builder = Image::ExifTool::BuildTagLookup->new;
# update Image::ExifTool::TagLookup
$ok = $builder->WriteTagLookup('lib/Image/ExifTool/TagLookup.pm');
diff --git a/lib/Image/ExifTool/Canon.pm b/lib/Image/ExifTool/Canon.pm
index 9f0d36ed..3dd9709f 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.72';
+$VERSION = '4.73';
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -1394,7 +1394,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
},
{
Name => 'CanonCameraInfoR6',
- Condition => '$$self{Model} =~ /\bEOS R6$/',
+ Condition => '$$self{Model} =~ /\bEOS R[56]$/',
SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6' },
},
{
@@ -4714,7 +4714,7 @@ my %ciMaxFocal = (
PRIORITY => 0,
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
NOTES => 'CameraInfo tags for the EOS R6.',
- 0x0af1 => { #forum15210
+ 0x0af1 => { #forum15210/15579
Name => 'ShutterCount',
Format => 'int32u',
Notes => 'includes electronic + mechanical shutter',
diff --git a/lib/Image/ExifTool/CanonVRD.pm b/lib/Image/ExifTool/CanonVRD.pm
index 5bee205a..11da665f 100644
--- a/lib/Image/ExifTool/CanonVRD.pm
+++ b/lib/Image/ExifTool/CanonVRD.pm
@@ -23,7 +23,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Canon;
-$VERSION = '1.36';
+$VERSION = '1.37';
sub ProcessCanonVRD($$;$);
sub WriteCanonVRD($$;$);
@@ -2011,7 +2011,7 @@ sub ProcessCanonVRD($$;$)
$verbose and print $out " Creating CanonVRD trailer\n";
$created = 1;
}
- $raf = new File::RandomAccess($dataPt);
+ $raf = File::RandomAccess->new($dataPt);
}
# read and validate the footer
$raf->Seek(-0x40-$offset, 2) or return 0;
diff --git a/lib/Image/ExifTool/DICOM.pm b/lib/Image/ExifTool/DICOM.pm
index 147336a1..3bac7792 100644
--- a/lib/Image/ExifTool/DICOM.pm
+++ b/lib/Image/ExifTool/DICOM.pm
@@ -20,7 +20,7 @@ use strict;
use vars qw($VERSION %uid);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.22';
+$VERSION = '1.23';
# DICOM VR (Value Representation) format conversions
my %dicomFormat = (
@@ -3668,7 +3668,7 @@ sub ProcessDICOM($$)
}
last if length $data < 8;
# create new RAF object from inflated data stream
- $raf = new File::RandomAccess(\$data);
+ $raf = File::RandomAccess->new(\$data);
# re-read start of stream (now decompressed)
$raf->Read($buff, 8) == 8 or last;
$group = Get16u(\$buff, 0);
diff --git a/lib/Image/ExifTool/DNG.pm b/lib/Image/ExifTool/DNG.pm
index e43683d6..4b937ffd 100644
--- a/lib/Image/ExifTool/DNG.pm
+++ b/lib/Image/ExifTool/DNG.pm
@@ -17,7 +17,7 @@ use Image::ExifTool::Exif;
use Image::ExifTool::MakerNotes;
use Image::ExifTool::CanonRaw;
-$VERSION = '1.24';
+$VERSION = '1.25';
sub ProcessOriginalRaw($$$);
sub ProcessAdobeData($$$);
@@ -516,7 +516,7 @@ sub ProcessAdobeMRW($$$)
my $buff = "\0MRM" . pack('N', $dirLen - 4);
# ignore leading byte order and directory count words
$buff .= substr($$dataPt, $dirStart + 4, $dirLen - 4);
- my $raf = new File::RandomAccess(\$buff);
+ my $raf = File::RandomAccess->new(\$buff);
my %dirInfo = ( RAF => $raf, OutFile => $outfile );
my $rtnVal = Image::ExifTool::MinoltaRaw::ProcessMRW($et, \%dirInfo);
if ($outfile and defined $$outfile and length $$outfile) {
@@ -548,7 +548,7 @@ sub ProcessAdobeRAF($$$)
}
$et->VerboseDir($dirInfo);
# make fake RAF object for processing (same acronym, different meaning)
- my $raf = new File::RandomAccess($dataPt);
+ my $raf = File::RandomAccess->new($dataPt);
my $num = '';
# loop through all records in Adobe RAF data:
# 0 - RAF table (not processed)
@@ -752,7 +752,7 @@ sub ProcessAdobeMakN($$$)
}
if ($outfile) {
# rewrite the maker notes directory
- my $fixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
+ my $fixup = $subdirInfo{Fixup} = Image::ExifTool::Fixup->new;
my $oldChanged = $$et{CHANGED};
my $buff = $et->WriteDirectory(\%subdirInfo, $subTable);
# nothing to do if error writing directory or nothing changed
diff --git a/lib/Image/ExifTool/Exif.pm b/lib/Image/ExifTool/Exif.pm
index 227bac24..0d9b30cc 100644
--- a/lib/Image/ExifTool/Exif.pm
+++ b/lib/Image/ExifTool/Exif.pm
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::MakerNotes;
-$VERSION = '4.48';
+$VERSION = '4.49';
sub ProcessExif($$$);
sub WriteExif($$$);
@@ -6465,7 +6465,7 @@ sub ProcessExif($$$)
TagInfo => $tagInfo || $tmpInfo,
Offset => $base + $valuePtr + $dataPos,
Size => $size,
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
};
}
} else {
diff --git a/lib/Image/ExifTool/FLIR.pm b/lib/Image/ExifTool/FLIR.pm
index efdaf1c4..4d020be0 100644
--- a/lib/Image/ExifTool/FLIR.pm
+++ b/lib/Image/ExifTool/FLIR.pm
@@ -24,7 +24,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
-$VERSION = '1.22';
+$VERSION = '1.23';
sub ProcessFLIR($$;$);
sub ProcessFLIRText($$$);
@@ -1468,7 +1468,7 @@ sub ProcessMeasInfo($$$)
sub ProcessFLIR($$;$)
{
my ($et, $dirInfo, $tagTablePtr) = @_;
- my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
+ my $raf = $$dirInfo{RAF} || File::RandomAccess->new($$dirInfo{DataPt});
my $verbose = $et->Options('Verbose');
my $out = $et->Options('TextOut');
my $base = $raf->Tell();
diff --git a/lib/Image/ExifTool/Fixup.pm b/lib/Image/ExifTool/Fixup.pm
index d940e7c5..0ba4fb1a 100644
--- a/lib/Image/ExifTool/Fixup.pm
+++ b/lib/Image/ExifTool/Fixup.pm
@@ -39,7 +39,7 @@ use Image::ExifTool qw(GetByteOrder SetByteOrder Get32u Get32s Set32u
Get16u Get16s Set16u);
use vars qw($VERSION);
-$VERSION = '1.05';
+$VERSION = '1.06';
sub AddFixup($$;$$);
sub ApplyFixup($$);
@@ -69,7 +69,7 @@ sub new
sub Clone($)
{
my $self = shift;
- my $clone = new Image::ExifTool::Fixup;
+ my $clone = Image::ExifTool::Fixup->new;
$clone->{Start} = $self->{Start};
$clone->{Shift} = $self->{Shift};
my $phash = $self->{Pointers};
@@ -317,7 +317,7 @@ Image::ExifTool::Fixup - Utility to handle pointer fixups
use Image::ExifTool::Fixup;
- $fixup = new Image::ExifTool::Fixup;
+ $fixup = Image::ExifTool::Fixup->new;
# add a new fixup to a pointer at the specified offset in data
$fixup->AddFixup($offset);
diff --git a/lib/Image/ExifTool/FlashPix.pm b/lib/Image/ExifTool/FlashPix.pm
index 442a1357..a1320b98 100644
--- a/lib/Image/ExifTool/FlashPix.pm
+++ b/lib/Image/ExifTool/FlashPix.pm
@@ -22,7 +22,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::ASF; # for GetGUID()
-$VERSION = '1.47';
+$VERSION = '1.48';
sub ProcessFPX($$);
sub ProcessFPXR($$$);
@@ -2206,7 +2206,7 @@ sub ProcessFPX($$)
my ($tag, %hier, %objIndex, %loadedDifSect);
# handle FPX format in memory from PNG cpIp chunk
- $raf or $raf = new File::RandomAccess($$dirInfo{DataPt});
+ $raf or $raf = File::RandomAccess->new($$dirInfo{DataPt});
# read header
return 0 unless $raf->Read($buff,HDR_SIZE) == HDR_SIZE;
@@ -2353,7 +2353,7 @@ sub ProcessFPX($$)
$et->Warn('Error loading Mini-FAT stream');
last;
}
- $miniStream = new File::RandomAccess(\$miniStreamBuff);
+ $miniStream = File::RandomAccess->new(\$miniStreamBuff);
}
my $tagInfo;
diff --git a/lib/Image/ExifTool/FujiFilm.pm b/lib/Image/ExifTool/FujiFilm.pm
index a4628ba4..30d78304 100644
--- a/lib/Image/ExifTool/FujiFilm.pm
+++ b/lib/Image/ExifTool/FujiFilm.pm
@@ -31,7 +31,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.91';
+$VERSION = '1.92';
sub ProcessFujiDir($$$);
sub ProcessFaceRec($$$);
@@ -1187,6 +1187,8 @@ my %faceCategories = (
ValueConv => 'my @v=reverse split(" ",$val);"@v"', # reverse to show width first
PrintConv => '$val=~tr/ /x/; $val',
},
+ # 0x112 - int16u[2] same as 0x111 but with width/height swapped?
+ # 0x113 - int16u[2] same as 0x111?
0x115 => {
Name => 'RawImageAspectRatio',
Format => 'int16u',
@@ -1236,6 +1238,7 @@ my %faceCategories = (
Count => 36,
PrintConv => '$val =~ tr/012 /RGB/d; join " ", $val =~ /....../g',
},
+ # 0x141 - int16u[2] Bit depth? "14 42" for 14-bit RAF and "16 48" for 16-bit RAF
0x2000 => { #IB
Name => 'WB_GRGBLevelsAuto',
Format => 'int16u',
@@ -1408,6 +1411,8 @@ my %faceCategories = (
0xf00e => 'WB_GRBLevels',
0xf00f => 'ChromaticAberrationParams', # (rational64s[23])
0xf010 => 'VignettingParams', #9 (rational64s[31 or 64])
+ # 0xf013 - int32u[3] same as 0xf00d
+ # 0xf014 - int32u[3] - also related to WhiteBalance
);
# information found in FFMV atom of MOV videos
@@ -1688,7 +1693,7 @@ sub WriteRAF($$)
# rewrite the embedded JPEG in memory
my %jpegInfo = (
Parent => 'RAF',
- RAF => new File::RandomAccess(\$jpeg),
+ RAF => File::RandomAccess->new(\$jpeg),
OutFile => \$outJpeg,
);
$$et{FILE_TYPE} = 'JPEG';
@@ -1792,7 +1797,7 @@ sub ProcessRAF($$)
# extract information from embedded JPEG
my %dirInfo = (
Parent => 'RAF',
- RAF => new File::RandomAccess(\$jpeg),
+ RAF => File::RandomAccess->new(\$jpeg),
);
if ($jpos) {
$$et{BASE} += $jpos;
diff --git a/lib/Image/ExifTool/Geotag.pm b/lib/Image/ExifTool/Geotag.pm
index 08b131a4..55bf8a59 100644
--- a/lib/Image/ExifTool/Geotag.pm
+++ b/lib/Image/ExifTool/Geotag.pm
@@ -29,7 +29,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:Public);
use Image::ExifTool::GPS;
-$VERSION = '1.73';
+$VERSION = '1.74';
sub JITTER() { return 2 } # maximum time jitter
@@ -174,7 +174,7 @@ sub LoadTrackLog($$;$)
# $val is track file name
if ($et->Open(\*EXIFTOOL_TRKFILE, $val)) {
$trackFile = $val;
- $raf = new File::RandomAccess(\*EXIFTOOL_TRKFILE);
+ $raf = File::RandomAccess->new(\*EXIFTOOL_TRKFILE);
unless ($raf->Read($_, 256)) {
close EXIFTOOL_TRKFILE;
return "Empty track file '${val}'";
@@ -202,7 +202,7 @@ sub LoadTrackLog($$;$)
}
unless ($from) {
# set up RAF for reading log file in memory
- $raf = new File::RandomAccess(\$val);
+ $raf = File::RandomAccess->new(\$val);
$from = 'data';
}
diff --git a/lib/Image/ExifTool/HtmlDump.pm b/lib/Image/ExifTool/HtmlDump.pm
index ae2f70db..cbc3cb43 100644
--- a/lib/Image/ExifTool/HtmlDump.pm
+++ b/lib/Image/ExifTool/HtmlDump.pm
@@ -13,7 +13,7 @@ use vars qw($VERSION);
use Image::ExifTool; # only for FinishTiffDump()
use Image::ExifTool::HTML qw(EscapeHTML);
-$VERSION = '1.39';
+$VERSION = '1.40';
sub DumpTable($$$;$$$$$$);
sub Open($$$;@);
@@ -894,7 +894,7 @@ Image::ExifTool::HtmlDump - Dump information in hex to HTML page
=head1 SYNOPSIS
use Image::ExifTool::HtmlDump;
- my $dump = new Image::ExifTool::HtmlDump;
+ my $dump = Image::ExifTool::HtmlDump->new;
$dump->Add($start, $size, $comment);
$dump->Print($dumpInfo, $raf, $dataPt, $dataPos, $outfile);
diff --git a/lib/Image/ExifTool/ID3.pm b/lib/Image/ExifTool/ID3.pm
index 840e64d6..24337f8a 100644
--- a/lib/Image/ExifTool/ID3.pm
+++ b/lib/Image/ExifTool/ID3.pm
@@ -18,7 +18,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.60';
+$VERSION = '1.61';
sub ProcessID3v2($$$);
sub ProcessPrivate($$$);
@@ -1408,7 +1408,7 @@ sub ProcessID3($$)
$$et{DoneID3} = 1;
# allow this to be called with either RAF or DataPt
- my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
+ my $raf = $$dirInfo{RAF} || File::RandomAccess->new($$dirInfo{DataPt});
my ($buff, %id3Header, %id3Trailer, $hBuff, $tBuff, $eBuff, $tagTablePtr);
my $rtnVal = 0;
my $hdrEnd = 0;
diff --git a/lib/Image/ExifTool/Import.pm b/lib/Image/ExifTool/Import.pm
index 2b2ba83f..84d73085 100644
--- a/lib/Image/ExifTool/Import.pm
+++ b/lib/Image/ExifTool/Import.pm
@@ -12,7 +12,7 @@ require Exporter;
use vars qw($VERSION @ISA @EXPORT_OK);
-$VERSION = '1.10';
+$VERSION = '1.11';
@ISA = qw(Exporter);
@EXPORT_OK = qw(ReadCSV ReadJSON);
@@ -38,13 +38,13 @@ sub ReadCSV($$;$$)
$raf = $file;
$file = 'CSV file';
} elsif (ref $file eq 'GLOB') {
- $raf = new File::RandomAccess($file);
+ $raf = File::RandomAccess->new($file);
$file = 'CSV file';
} else {
open CSVFILE, $file or return "Error opening CSV file '${file}'";
binmode CSVFILE;
$openedFile = 1;
- $raf = new File::RandomAccess(\*CSVFILE);
+ $raf = File::RandomAccess->new(\*CSVFILE);
}
$delim = ',' unless defined $delim;
# set input record separator by first newline found in the file
@@ -253,13 +253,13 @@ sub ReadJSON($$;$$)
$raf = $file;
$file = 'JSON file';
} elsif (ref $file eq 'GLOB') {
- $raf = new File::RandomAccess($file);
+ $raf = File::RandomAccess->new($file);
$file = 'JSON file';
} else {
open JSONFILE, $file or return "Error opening JSON file '${file}'";
binmode JSONFILE;
$openedFile = 1;
- $raf = new File::RandomAccess(\*JSONFILE);
+ $raf = File::RandomAccess->new(\*JSONFILE);
}
my $obj = ReadJSONObject($raf);
close JSONFILE if $openedFile;
diff --git a/lib/Image/ExifTool/JSON.pm b/lib/Image/ExifTool/JSON.pm
index bc6f3dfb..bbaa6f6f 100644
--- a/lib/Image/ExifTool/JSON.pm
+++ b/lib/Image/ExifTool/JSON.pm
@@ -14,7 +14,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Import;
-$VERSION = '1.06';
+$VERSION = '1.07';
sub ProcessJSON($$);
sub ProcessTag($$$$%);
@@ -120,7 +120,7 @@ sub ProcessJSON($$)
my $buff = substr(${$$dirInfo{DataPt}}, $$dirInfo{DirStart}, $$dirInfo{DirLen});
$dataPt = \$buff;
}
- $raf = new File::RandomAccess($dataPt);
+ $raf = File::RandomAccess->new($dataPt);
# extract as a block if requested
my $blockName = $$dirInfo{BlockInfo} ? $$dirInfo{BlockInfo}{Name} : '';
my $blockExtract = $et->Options('BlockExtract');
diff --git a/lib/Image/ExifTool/Jpeg2000.pm b/lib/Image/ExifTool/Jpeg2000.pm
index 0a10f9ba..8aef5777 100644
--- a/lib/Image/ExifTool/Jpeg2000.pm
+++ b/lib/Image/ExifTool/Jpeg2000.pm
@@ -16,7 +16,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.37';
+$VERSION = '1.38';
sub ProcessJpeg2000Box($$$);
sub ProcessJUMD($$$);
@@ -1583,7 +1583,7 @@ sub ProcessJXL($$)
$$et{IsJXL} = 2;
my $buff = "\0\0\0\x0cJXL \x0d\x0a\x87\x0a\0\0\0\x14ftypjxl \0\0\0\0jxl ";
# add metadata to empty ISO BMFF container
- $$dirInfo{RAF} = new File::RandomAccess(\$buff);
+ $$dirInfo{RAF} = File::RandomAccess->new(\$buff);
} else {
$et->SetFileType('JXL Codestream','image/jxl', 'jxl');
if ($$et{ImageDataHash} and $raf->Seek(0,0)) {
diff --git a/lib/Image/ExifTool/MIE.pm b/lib/Image/ExifTool/MIE.pm
index f693d61b..109e38a6 100644
--- a/lib/Image/ExifTool/MIE.pm
+++ b/lib/Image/ExifTool/MIE.pm
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
-$VERSION = '1.52';
+$VERSION = '1.53';
sub ProcessMIE($$);
sub ProcessMIEGroup($$$);
@@ -1077,7 +1077,7 @@ sub WriteMIEGroup($$$)
$newVal = '';
%subdirInfo = (
OutFile => \$newVal,
- RAF => new File::RandomAccess(\$oldVal),
+ RAF => File::RandomAccess(\$oldVal)->new,
);
} elsif ($optCompress and not $$dirInfo{IsCompressed}) {
# write to memory so we can compress the new MIE group
@@ -1585,7 +1585,7 @@ sub ProcessMIEGroup($$$)
WasCompressed => $wasCompressed,
);
# read from uncompressed data instead if necessary
- $subdirInfo{RAF} = new File::RandomAccess(\$value) if $valLen;
+ $subdirInfo{RAF} = File::RandomAccess(\$value)->new if $valLen;
my $oldOrder = GetByteOrder();
SetByteOrder($format & 0x08 ? 'II' : 'MM');
diff --git a/lib/Image/ExifTool/MinoltaRaw.pm b/lib/Image/ExifTool/MinoltaRaw.pm
index 1523302a..6f3015d5 100644
--- a/lib/Image/ExifTool/MinoltaRaw.pm
+++ b/lib/Image/ExifTool/MinoltaRaw.pm
@@ -17,7 +17,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Minolta;
-$VERSION = '1.19';
+$VERSION = '1.20';
sub ProcessMRW($$;$);
sub WriteMRW($$;$);
@@ -400,7 +400,7 @@ sub ProcessMRW($$;$)
if ($$dirInfo{DataPt}) {
# make a RAF object for MRW information extracted from other file types
- $raf = new File::RandomAccess($$dirInfo{DataPt});
+ $raf = File::RandomAccess->new($$dirInfo{DataPt});
# MRW information in DNG images may not start at beginning of data block
$raf->Seek($$dirInfo{DirStart}, 0) if $$dirInfo{DirStart};
}
diff --git a/lib/Image/ExifTool/Nikon.pm b/lib/Image/ExifTool/Nikon.pm
index 0b2bbf71..9fbd9863 100644
--- a/lib/Image/ExifTool/Nikon.pm
+++ b/lib/Image/ExifTool/Nikon.pm
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
use Image::ExifTool::XMP;
-$VERSION = '4.29';
+$VERSION = '4.30';
sub LensIDConv($$$);
sub ProcessNikonAVI($$$);
@@ -677,6 +677,7 @@ sub GetAFPointGrid($$;$);
'71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
'FD 00 50 50 18 18 DF 00' => 'Voigtlander APO-Lanthar 50mm F2 Aspherical', #35
'FD 00 44 44 18 18 DF 00' => 'Voigtlander APO-Lanthar 35mm F2', #30
+ 'FD 00 59 59 18 18 DF 00' => 'Voigtlander Macro APO-Lanthar 65mm F2', #30
#
'00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
'00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -690,6 +691,7 @@ sub GetAFPointGrid($$;$);
'00 54 62 62 0C 0C 00 00' => 'Carl Zeiss Planar T* 1.4/85 ZF.2',
'00 54 68 68 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/100 ZF.2',
'00 54 72 72 18 18 00 00' => 'Carl Zeiss Apo Sonnar T* 2/135 ZF.2',
+ '02 54 3C 3C 0C 0C 00 00' => 'Zeiss Otus 1.4/28 ZF.2', #30
'00 54 53 53 0C 0C 00 00' => 'Zeiss Otus 1.4/55', #IB
'01 54 62 62 0C 0C 00 00' => 'Zeiss Otus 1.4/85',
'03 54 68 68 0C 0C 00 00' => 'Zeiss Otus 1.4/100', #IB
diff --git a/lib/Image/ExifTool/NikonCustom.pm b/lib/Image/ExifTool/NikonCustom.pm
index 7aff0833..8fbc76ae 100644
--- a/lib/Image/ExifTool/NikonCustom.pm
+++ b/lib/Image/ExifTool/NikonCustom.pm
@@ -9852,7 +9852,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
85 => { Name => 'HighSpeedSync', PrintConv => \%offOn }, # CSe1-b
87 => { # CSe2
Name => 'FlashShutterSpeed',
- ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accomodate 4 new values?
+ ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accommodate 4 new values?
PrintConv => {
0 => '1 s',
1 => '1/2 s',
@@ -10242,7 +10242,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
85 => { Name => 'HighSpeedSync', PrintConv => \%offOn }, # CSe1-b
87 => { # CSe2
Name => 'FlashShutterSpeed',
- ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accomodate 4 new values?
+ ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accommodate 4 new values?
PrintConv => {
0 => '1 s',
1 => '1/2 s',
@@ -10652,7 +10652,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
85 => { Name => 'HighSpeedSync', PrintConv => \%offOn }, # CSe1-b
87 => { # CSe2
Name => 'FlashShutterSpeed',
- ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accomodate 4 new values?
+ ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accommodate 4 new values?
PrintConv => {
0 => '1 s',
1 => '1/2 s',
diff --git a/lib/Image/ExifTool/Ogg.pm b/lib/Image/ExifTool/Ogg.pm
index 34ff5273..7b07c593 100644
--- a/lib/Image/ExifTool/Ogg.pm
+++ b/lib/Image/ExifTool/Ogg.pm
@@ -17,7 +17,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.02';
+$VERSION = '1.03';
my $MAX_PACKETS = 2; # maximum packets to scan from each stream at start of file
@@ -189,7 +189,7 @@ sub ProcessOGG($$)
if (defined $numFlac and defined $val{$stream}) {
# process FLAC headers as if it was a complete FLAC file
require Image::ExifTool::FLAC;
- my %dirInfo = ( RAF => new File::RandomAccess(\$val{$stream}) );
+ my %dirInfo = ( RAF => File::RandomAccess->new(\$val{$stream}) );
Image::ExifTool::FLAC::ProcessFLAC($et, \%dirInfo);
}
return $success;
diff --git a/lib/Image/ExifTool/PLIST.pm b/lib/Image/ExifTool/PLIST.pm
index 6cc81c35..21ba713d 100644
--- a/lib/Image/ExifTool/PLIST.pm
+++ b/lib/Image/ExifTool/PLIST.pm
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::XMP;
use Image::ExifTool::GPS;
-$VERSION = '1.11';
+$VERSION = '1.12';
sub ExtractObject($$;$);
sub Get24u($$);
@@ -351,9 +351,9 @@ sub ProcessBinaryPLIST($$;$)
my $start = $$dirInfo{DirStart};
if ($start or ($$dirInfo{DirLen} and $$dirInfo{DirLen} != length $$dataPt)) {
my $buf2 = substr($$dataPt, $start || 0, $$dirInfo{DirLen});
- $$dirInfo{RAF} = new File::RandomAccess(\$buf2);
+ $$dirInfo{RAF} = File::RandomAccess->new(\$buf2);
} else {
- $$dirInfo{RAF} = new File::RandomAccess($dataPt);
+ $$dirInfo{RAF} = File::RandomAccess->new($dataPt);
}
my $strt = $$dirInfo{DirStart} || 0;
}
diff --git a/lib/Image/ExifTool/PanasonicRaw.pm b/lib/Image/ExifTool/PanasonicRaw.pm
index d0e2f594..9ca9f124 100644
--- a/lib/Image/ExifTool/PanasonicRaw.pm
+++ b/lib/Image/ExifTool/PanasonicRaw.pm
@@ -21,7 +21,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.28';
+$VERSION = '1.29';
sub ProcessJpgFromRaw($$$);
sub WriteJpgFromRaw($$$);
@@ -839,7 +839,7 @@ sub WriteJpgFromRaw($$$)
my $buff = substr($$dataPt, $dirStart, $dirLen);
$dataPt = \$buff;
}
- my $raf = new File::RandomAccess($dataPt);
+ my $raf = File::RandomAccess->new($dataPt);
my $outbuff;
my %dirInfo = (
RAF => $raf,
@@ -890,7 +890,7 @@ sub ProcessJpgFromRaw($$$)
# extract information from embedded JPEG
my %dirInfo = (
Parent => 'RAF',
- RAF => new File::RandomAccess($dataPt),
+ RAF => File::RandomAccess->new($dataPt),
);
if ($verbose) {
my $indent = $$et{INDENT};
diff --git a/lib/Image/ExifTool/PhaseOne.pm b/lib/Image/ExifTool/PhaseOne.pm
index 73d78908..7c32dcf9 100644
--- a/lib/Image/ExifTool/PhaseOne.pm
+++ b/lib/Image/ExifTool/PhaseOne.pm
@@ -15,7 +15,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.09';
+$VERSION = '1.10';
sub WritePhaseOne($$$);
sub ProcessPhaseOne($$$);
@@ -473,7 +473,7 @@ sub WritePhaseOne($$$)
return undef if $numEntries < 2 or $numEntries > 300 or $ifdEnd > $dirLen;
my $hdrBuff = $hdr;
my $valBuff = ''; # buffer for value data
- my $fixup = new Image::ExifTool::Fixup;
+ my $fixup = Image::ExifTool::Fixup->new;
my $index;
for ($index=0; $index<$numEntries; ++$index) {
my $entry = $dirStart + $ifdStart + 8 + $entrySize * $index;
diff --git a/lib/Image/ExifTool/Photoshop.pm b/lib/Image/ExifTool/Photoshop.pm
index 4184a5f9..c6d8c62e 100644
--- a/lib/Image/ExifTool/Photoshop.pm
+++ b/lib/Image/ExifTool/Photoshop.pm
@@ -28,7 +28,7 @@ use strict;
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.69';
+$VERSION = '1.70';
sub ProcessPhotoshop($$$);
sub WritePhotoshop($$$);
@@ -70,7 +70,7 @@ my %thumbnailInfo = (
Protected => 1,
RawConv => 'my $img=substr($val,0x1c); $self->ValidateImage(\$img,$tag)',
ValueConvInv => q{
- my $et = new Image::ExifTool;
+ my $et = Image::ExifTool->new;
my @tags = qw{ImageWidth ImageHeight FileType};
my $info = $et->ImageInfo(\$val, @tags);
my ($w, $h, $type) = @$info{@tags};
@@ -892,7 +892,7 @@ sub ProcessDocumentData($$$)
unless ($raf) {
my $dataPt = $$dirInfo{DataPt};
my $start = $$dirInfo{DirStart} || 0;
- $raf = new File::RandomAccess($dataPt);
+ $raf = File::RandomAccess->new($dataPt);
$raf->Seek($start, 0) if $start;
$dirLen = length $$dataPt - $start unless defined $dirLen;
$et->VerboseDump($dataPt, Start => $start, Len => $dirLen, Base => $$dirInfo{Base});
diff --git a/lib/Image/ExifTool/PostScript.pm b/lib/Image/ExifTool/PostScript.pm
index 80a4b457..3df944ee 100644
--- a/lib/Image/ExifTool/PostScript.pm
+++ b/lib/Image/ExifTool/PostScript.pm
@@ -16,7 +16,7 @@ use strict;
use vars qw($VERSION $AUTOLOAD);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.44';
+$VERSION = '1.45';
sub WritePS($$);
sub ProcessPS($$;$);
@@ -430,7 +430,7 @@ sub ProcessPS($$;$)
# allow read from data
unless ($raf) {
- $raf = new File::RandomAccess($$dirInfo{DataPt});
+ $raf = File::RandomAccess->new($$dirInfo{DataPt});
$et->VerboseDir('PostScript');
}
#
diff --git a/lib/Image/ExifTool/QuickTime.pm b/lib/Image/ExifTool/QuickTime.pm
index e12d7d05..e2cd3692 100644
--- a/lib/Image/ExifTool/QuickTime.pm
+++ b/lib/Image/ExifTool/QuickTime.pm
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
-$VERSION = '2.91';
+$VERSION = '2.92';
sub ProcessMOV($$;$);
sub ProcessKeys($$$);
@@ -268,6 +268,24 @@ my %timeInfo = (
PrintConvInv => '$self->InverseDateTime($val)',
# (can't put Groups here because they aren't constant!)
);
+# properties for ISO 8601 format date/time tags
+my %iso8601Date = (
+ Shift => 'Time',
+ ValueConv => q{
+ require Image::ExifTool::XMP;
+ $val = Image::ExifTool::XMP::ConvertXMPDate($val);
+ $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
+ return $val;
+ },
+ ValueConvInv => q{
+ require Image::ExifTool::XMP;
+ my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
+ ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
+ return $val;
+ },
+ PrintConv => '$self->ConvertDateTime($val)',
+ PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
+);
# information for duration tags
my %durationInfo = (
ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val',
@@ -1574,22 +1592,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
"\xa9day" => {
Name => 'ContentCreateDate',
Groups => { 2 => 'Time' },
- Shift => 'Time',
- # handle values in the form "2010-02-12T13:27:14-0800" (written by Apple iPhone)
- ValueConv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
- return $val;
- },
- ValueConvInv => q{
- require Image::ExifTool::XMP;
- my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
- ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
- return $val;
- },
- PrintConv => '$self->ConvertDateTime($val)',
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
+ %iso8601Date,
},
"\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
"\xa9alb" => 'Album', #PH (iTunes 8.0.2)
@@ -1873,21 +1876,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
Apple Photos has been reported to show a crazy date/time for some MP4 files
containing this tag, but perhaps only if it is missing a time zone
}, #forum10690/11125
- Shift => 'Time',
- ValueConv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
- return $val;
- },
- ValueConvInv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
- return $val;
- },
- PrintConv => '$self->ConvertDateTime($val)',
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
+ %iso8601Date,
},
manu => { # (SX280)
Name => 'Make',
@@ -2310,23 +2299,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models
},
Groups => { 2 => 'Time' },
- Shift => 'Time',
Avoid => 1,
# handle values in the form "2010-02-12T13:27:14-0800"
- ValueConv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
- return $val;
- },
- ValueConvInv => q{
- require Image::ExifTool::XMP;
- my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
- ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
- return $val;
- },
- PrintConv => '$self->ConvertDateTime($val)',
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
+ %iso8601Date,
},
'@xyz' => { #PH (iPhone 3GS)
Name => 'GPSCoordinates',
@@ -3339,22 +3314,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
"\xa9day" => {
Name => 'ContentCreateDate',
Groups => { 2 => 'Time' },
- Shift => 'Time',
- # handle values in the form "2010-02-12T13:27:14-0800"
- ValueConv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
- return $val;
- },
- ValueConvInv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
- return $val;
- },
- PrintConv => '$self->ConvertDateTime($val)',
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
+ %iso8601Date,
},
"\xa9des" => 'Description', #4
"\xa9enc" => 'EncodedBy', #10
@@ -6403,12 +6363,10 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
ValueConvInv => '$val * 1000',
PrintConv => 'ConvertDuration($val)',
PrintConvInv => q{
- $val =~ s/ s$//;
- my @a = split /(:| days )/, $val;
- my $sign = ($val =~ s/^-//) ? -1 : 1;
- $a[0] += shift(@a) * 24 if @a == 4;
- $a[0] += shift(@a) * 60 while @a > 1;
- return $a[0] * $sign;
+ my $sign = ($val =~ s/^-//) ? -1 : 1;
+ my @a = $val =~ /(\d+(?:\.\d+)?)/g;
+ unshift @a, 0 while @a < 4;
+ return $sign * (((($a[0] * 24) + $a[1]) * 60 + $a[2]) * 60 + $a[3]);
},
},
@@ -6522,21 +6480,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
creationdate=> {
Name => 'CreationDate',
Groups => { 2 => 'Time' },
- Shift => 'Time',
- ValueConv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::ConvertXMPDate($val,1);
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
- return $val;
- },
- ValueConvInv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
- return $val;
- },
- PrintConv => '$self->ConvertDateTime($val)',
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
+ %iso8601Date,
},
description => { },
director => { },
@@ -6586,21 +6530,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
'location.date' => {
Name => 'LocationDate',
Groups => { 2 => 'Time' },
- Shift => 'Time',
- ValueConv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
- return $val;
- },
- ValueConvInv => q{
- require Image::ExifTool::XMP;
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
- return $val;
- },
- PrintConv => '$self->ConvertDateTime($val)',
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
+ %iso8601Date,
},
'location.accuracy.horizontal' => { Name => 'LocationAccuracyHorizontal' },
'live-photo.auto' => { Name => 'LivePhotoAuto', Writable => 'int8u' },
@@ -6693,6 +6623,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
'detected-face.roll-angle' => { Name => 'DetectedFaceRollAngle', Writable => 0 },
# (fiel)com.apple.quicktime.detected-face.yaw-angle (dtyp=23, float)
'detected-face.yaw-angle' => { Name => 'DetectedFaceYawAngle', Writable => 0 },
+ # the following tags generated by ShutterEncoder when "preserve metadata" is selected (forum15610)
+ major_brand => { Name => 'MajorBrand', Avoid => 1 },
+ minor_version => { Name => 'MinorVersion', Avoid => 1 },
+ compatible_brands => { Name => 'CompatibleBrands', Avoid => 1 },
+ creation_time => {
+ Name => 'CreationTime',
+ Groups => { 2 => 'Time' },
+ Avoid => 1,
+ %iso8601Date,
+ },
#
# seen in Apple ProRes RAW file
#
@@ -6708,13 +6648,6 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
# (mdta)com.apple.proapps.image.{TIFF}.Make (eg. "Atmos")
# (mdta)com.apple.proapps.image.{TIFF}.Model (eg. "ShogunInferno")
# (mdta)com.apple.proapps.image.{TIFF}.Software (eg. "9.0")
-#
-# also seen (but don't yet add support for these)
-#
- # (mdta)major_brand
- # (mdta)minor_version
- # (mdta)compatible_brands
- # (mdta)creation_time
);
# iTunes info ('----') atoms
@@ -9373,7 +9306,7 @@ sub ProcessMOV($$;$)
}
# more convenient to package data as a RandomAccess file
unless ($raf) {
- $raf = new File::RandomAccess($dataPt);
+ $raf = File::RandomAccess->new($dataPt);
$dirEnd = $dataPos + $$dirInfo{DirLen} + ($$dirInfo{DirStart} || 0) if $$dirInfo{DirLen};
}
# skip leading bytes if necessary
diff --git a/lib/Image/ExifTool/QuickTimeStream.pl b/lib/Image/ExifTool/QuickTimeStream.pl
index c284bbd0..aae5f6c7 100644
--- a/lib/Image/ExifTool/QuickTimeStream.pl
+++ b/lib/Image/ExifTool/QuickTimeStream.pl
@@ -848,11 +848,11 @@ sub FoundSomething($$;$$)
#------------------------------------------------------------------------------
# Approximate GPSDateTime value from sample time and CreateDate
# Inputs: 0) ExifTool ref, 1) tag table ptr, 2) sample time (s)
-# 3) true if CreateDate is at end of video
+# 3) true if CreateDate is at end of video, 4) flag if CreateDate is UTC
# Notes: Uses ExifTool CreateDateAtEnd as flag to subtract video duration
-sub SetGPSDateTime($$$)
+sub SetGPSDateTime($$$;$)
{
- my ($et, $tagTbl, $sampleTime) = @_;
+ my ($et, $tagTbl, $sampleTime, $isUTC) = @_;
my $value = $$et{VALUE};
if (defined $sampleTime and $$value{CreateDate}) {
$sampleTime += $$value{CreateDate}; # adjust sample time to seconds since the epoch
@@ -863,7 +863,9 @@ sub SetGPSDateTime($$$)
} else {
$et->WarnOnce('Approximating GPSDateTime as CreateDate + SampleTime', 1);
}
- unless ($et->Options('QuickTimeUTC')) {
+ my $utc = $et->Options('QuickTimeUTC');
+ $utc = $isUTC unless defined $utc; # (allow QuickTimeUTC=0 to override $isUTC default)
+ unless ($utc) {
my $tzOff = $$et{tzOff}; # use previously calculated offset
unless (defined $tzOff) {
# adjust to UTC, assuming time is local
@@ -1344,7 +1346,7 @@ Sample: for ($i=0; ; ) {
$et->HandleTag($tagTbl, GPSLatitude => Get32s(\$buff, 12+$n) * 180/0x80000000);
$et->HandleTag($tagTbl, GPSLongitude => Get32s(\$buff, 16+$n) * 180/0x80000000);
$et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, 8+$n) * $mphToKph);
- SetGPSDateTime($et, $tagTbl, $time[$i]);
+ SetGPSDateTime($et, $tagTbl, $time[$i], 1);
next; # all done (don't store/process as text)
}
unless (defined $val) {
@@ -2454,7 +2456,7 @@ sub ProcessLIGO_JSON($$$)
$et->VerboseDir('LIGO_JSON', undef, length($$dataPt));
while ($$dataPt =~ /LIGOGPSINFO (\{.*?\})/g) {
my $json = $1;
- my $raf = new File::RandomAccess(\$json);
+ my $raf = File::RandomAccess->new(\$json);
my %dbase;
Image::ExifTool::Import::ReadJSON($raf, \%dbase);
my $info = $dbase{'*'} or next;
diff --git a/lib/Image/ExifTool/RSRC.pm b/lib/Image/ExifTool/RSRC.pm
index 395c556e..40e691ec 100644
--- a/lib/Image/ExifTool/RSRC.pm
+++ b/lib/Image/ExifTool/RSRC.pm
@@ -14,7 +14,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.09';
+$VERSION = '1.10';
sub ProcessRSRC($$);
@@ -70,7 +70,7 @@ sub ProcessRSRC($$)
my ($hdr, $map, $buff, $i, $j);
# allow access with data reference
- $raf or $raf = new File::RandomAccess($$dirInfo{DataPt});
+ $raf or $raf = File::RandomAccess->new($$dirInfo{DataPt});
# attempt to validate the format as thoroughly as practical
return 0 unless $raf->Read($hdr, 30) == 30;
diff --git a/lib/Image/ExifTool/Samsung.pm b/lib/Image/ExifTool/Samsung.pm
index 8d289301..b066b68f 100644
--- a/lib/Image/ExifTool/Samsung.pm
+++ b/lib/Image/ExifTool/Samsung.pm
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.55';
+$VERSION = '1.56';
sub WriteSTMN($$$);
sub ProcessINFO($$$);
@@ -1546,7 +1546,7 @@ sub ProcessSamsung($$$)
my ($buff, $buf2, $index, $offsetPos, $audioNOff, $audioSize);
unless ($raf) {
- $raf = new File::RandomAccess($$dirInfo{DataPt});
+ $raf = File::RandomAccess->new($$dirInfo{DataPt});
$et->VerboseDir('SamsungTrailer');
}
return 0 unless $raf->Seek(-6-$offset, 2) and $raf->Read($buff, 6) == 6 and
@@ -1675,7 +1675,7 @@ SamBlock:
# add a fixup so the calling routine can apply further shifts if necessary
require Image::ExifTool::Fixup;
my $fixup = $$dirInfo{Fixup};
- $fixup or $fixup = $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
+ $fixup or $fixup = $$dirInfo{Fixup} = Image::ExifTool::Fixup->new;
$fixup->AddFixup(length($buff) - $offsetPos);
$fixup->AddFixup(length($buff) - $offsetPos + 4);
}
@@ -1697,7 +1697,7 @@ sub WriteSTMN($$$)
{
my ($et, $dirInfo, $tagTablePtr) = @_;
# create a Fixup for the PreviewImage
- $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
+ $$dirInfo{Fixup} = Image::ExifTool::Fixup->new;
my $val = Image::ExifTool::WriteBinaryData($et, $dirInfo, $tagTablePtr);
# force PreviewImage into the trailer even if it fits in EXIF segment
$$et{PREVIEW_INFO}{IsTrailer} = 1 if $$et{PREVIEW_INFO};
diff --git a/lib/Image/ExifTool/Shift.pl b/lib/Image/ExifTool/Shift.pl
index c68e7412..bd743c5f 100644
--- a/lib/Image/ExifTool/Shift.pl
+++ b/lib/Image/ExifTool/Shift.pl
@@ -403,7 +403,7 @@ sub ShiftTime($;$$$)
};
$@ and return CleanWarning($@);
$tm += $$shiftOffset{$mode}; # apply the shift
- $tm < 0 and return 'Shift results in negative time';
+ $tm < 0 and return 'Shift results in date before 1970';
# save fractional seconds in shifted time
$frac = $tm - int($tm);
if ($frac) {
diff --git a/lib/Image/ExifTool/SigmaRaw.pm b/lib/Image/ExifTool/SigmaRaw.pm
index d9734783..a0330eec 100644
--- a/lib/Image/ExifTool/SigmaRaw.pm
+++ b/lib/Image/ExifTool/SigmaRaw.pm
@@ -16,7 +16,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Sigma;
-$VERSION = '1.31';
+$VERSION = '1.32';
sub ProcessX3FHeader($$$);
sub ProcessX3FDirectory($$$);
@@ -460,7 +460,7 @@ sub WriteX3F($$)
my $newData;
my %jpegInfo = (
Parent => 'X3F',
- RAF => new File::RandomAccess(\$buff),
+ RAF => File::RandomAccess->new(\$buff),
OutFile => \$newData,
);
$$et{FILE_TYPE} = 'JPEG';
@@ -575,7 +575,7 @@ sub ProcessX3FDirectory($$$)
if ($$tagInfo{Name} eq 'JpgFromRaw') {
my %dirInfo = (
Parent => 'X3F',
- RAF => new File::RandomAccess(\$buff),
+ RAF => File::RandomAccess->new(\$buff),
);
$$et{BASE} += $offset;
$et->ProcessJPEG(\%dirInfo);
diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm
index 0ba598a7..4172e71a 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.66';
+$VERSION = '3.67';
sub ProcessSRF($$$);
sub ProcessSR2($$$);
@@ -859,7 +859,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
# must construct 0x20-byte header which contains length, width and height
ValueConvInv => q{
return 'none' unless $val;
- my $e = new Image::ExifTool;
+ my $e = Image::ExifTool->new;
my $info = $e->ImageInfo(\$val,'ImageWidth','ImageHeight');
return undef unless $$info{ImageWidth} and $$info{ImageHeight};
my $size = Set32u($$info{ImageWidth}) . Set32u($$info{ImageHeight});
@@ -11640,7 +11640,7 @@ sub ProcessSR2($$$)
);
my $subTable = GetTagTable('Image::ExifTool::Sony::SR2SubIFD');
if ($outfile) {
- my $fixup = new Image::ExifTool::Fixup;
+ my $fixup = Image::ExifTool::Fixup->new;
$dirInfo{Fixup} = $fixup;
$result = $et->WriteDirectory(\%dirInfo, $subTable);
return undef unless $result;
diff --git a/lib/Image/ExifTool/TagInfoXML.pm b/lib/Image/ExifTool/TagInfoXML.pm
index d3ba2d95..4398c578 100644
--- a/lib/Image/ExifTool/TagInfoXML.pm
+++ b/lib/Image/ExifTool/TagInfoXML.pm
@@ -15,7 +15,7 @@ use vars qw($VERSION @ISA $makeMissing);
use Image::ExifTool qw(:Utils :Vars);
use Image::ExifTool::XMP;
-$VERSION = '1.35';
+$VERSION = '1.36';
@ISA = qw(Exporter);
# set this to a language code to generate Lang module with 'MISSING' entries
@@ -74,7 +74,7 @@ sub Write(;$$%)
{
local ($_, *PTIFILE);
my ($file, $group, %opts) = @_;
- my $et = new Image::ExifTool;
+ my $et = Image::ExifTool->new;
my ($fp, $tableName, %langInfo, @langs, $defaultLang, @groups);
@groups = split ':', $group if $group;
diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm
index 7a58f855..6db923f3 100644
--- a/lib/Image/ExifTool/TagLookup.pm
+++ b/lib/Image/ExifTool/TagLookup.pm
@@ -17,7 +17,7 @@ require Exporter;
use vars qw($VERSION @ISA @EXPORT_OK);
use Image::ExifTool qw(:Utils);
-$VERSION = '1.19';
+$VERSION = '1.20';
@ISA = qw(Exporter);
@EXPORT_OK = qw(FindTagInfo TagExists);
@@ -1870,6 +1870,7 @@ my %tagLookup = (
'commanderinternalttlcompgroupb' => { 312 => '22.1', 313 => '28.1' },
'comment' => { 0 => 0x2, 123 => 'Comment', 160 => 'Comment', 336 => 'Comment', 399 => "\xa9cmt", 401 => 'comment', 407 => "\xa9cmt" },
'compass' => { 417 => 0x4 },
+ 'compatiblebrands' => { 401 => 'compatible_brands' },
'compatibleversion' => { 509 => 'CompatibleVersion', 511 => 'CompatibleVersion' },
'compilation' => { 399 => 'cpil' },
'compimageimagespersequence' => { 516 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesNumberOfImagesInSequences'] },
@@ -2022,7 +2023,7 @@ my %tagLookup = (
'crc32' => { 513 => 'crc32' },
'createdate' => { 122 => 0x9004, 160 => 'CreateDate', 332 => 'CreationDate', 336 => 'create-date', 398 => 'CreationDate', 404 => 0x1, 536 => 'CreateDate' },
'creationdate' => { 401 => 'creationdate', 525 => 'CreationDate', 528 => 'creationDate' },
- 'creationtime' => { 336 => 'Creation Time' },
+ 'creationtime' => { 336 => 'Creation Time', 401 => 'creation_time' },
'creativestyle' => { 434 => 0x1a, 435 => 0x18, 445 => 0x41, 448 => 0xb020, 480 => 0x4a },
'creativestylesetting' => { 436 => 0xf, 453 => 0x7 },
'creativestylewaschanged' => { 485 => 0x8001 },
@@ -4314,6 +4315,7 @@ my %tagLookup = (
'mainboardversion' => { 141 => 0x438 },
'maindialexposurecomp' => { 314 => '0.6' },
'mainingredient' => { 530 => 'mainIngredient' },
+ 'majorbrand' => { 401 => 'major_brand' },
'majorversion' => { 500 => 'MajorVersion' },
'make' => { 101 => 0x0, 118 => 0x1, 122 => 0x10f, 159 => 'Make', 336 => 'Make', 352 => 0x10f, 401 => 'make', 407 => ['@mak',"\xa9mak"], 527 => 'make', 534 => 'Make' },
'makernote' => { 515 => 'MakerNote' },
@@ -4781,7 +4783,7 @@ my %tagLookup = (
'minoltaquality' => { 184 => 0x5, 185 => 0xd, 186 => 0x3, 189 => [0x102,0x103] },
'minoltatime' => { 184 => 0x16 },
'minormodelagedisclosure' => { 333 => 'MinorModelAgeDisclosure' },
- 'minorversion' => { 500 => 'MinorVersion' },
+ 'minorversion' => { 401 => 'minor_version', 500 => 'MinorVersion' },
'minsamplevalue' => { 122 => 0x118 },
'mirrorlockup' => { 85 => 0xc, 86 => 0xc, 87 => 0x60f, 88 => 0xb, 89 => 0xc, 90 => 0x6, 91 => 0x6, 92 => 0xc, 93 => 0x3 },
'mobilecountrycode' => { 508 => 'mcc' },
@@ -8509,7 +8511,6 @@ my %tagExists = (
'companymainphone' => 1,
'companyname' => 1,
'compatibility' => 1,
- 'compatiblebrands' => 1,
'compatiblefontname' => 1,
'complete' => 1,
'compobj' => 1,
@@ -10361,7 +10362,6 @@ my %tagExists = (
'mainboard' => 1,
'maininfo' => 1,
'maininfoifd' => 1,
- 'majorbrand' => 1,
'makeandmodel' => 1,
'makemodel' => 1,
'makernotepentax5a' => 1,
diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod
index fb872f7e..f69196a0 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 27469 tags, with 17233 unique tag names.
+They contain a total of 27473 tags, with 17233 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
@@ -29481,8 +29481,10 @@ changed via the config file.
'com.android.version' AndroidVersion yes
'com.apple.photos.captureMode' CaptureMode yes
'comment' Comment yes
+ 'compatible_brands' CompatibleBrands yes/
'content.identifier' ContentIdentifier yes
'copyright' Copyright yes
+ 'creation_time' CreationTime yes/
'creationdate' CreationDate yes
'description' Description yes
'detected-face' FaceInfo QuickTime FaceInfo
@@ -29514,7 +29516,9 @@ changed via the config file.
'location.name' LocationName yes
'location.note' LocationNote yes
'location.role' LocationRole yes
+ 'major_brand' MajorBrand yes/
'make' Make yes
+ 'minor_version' MinorVersion yes/
'model' Model yes
'player.movie.audio.balance' Balance yes
'player.movie.audio.bass' Bass yes
diff --git a/lib/Image/ExifTool/WriteCanonRaw.pl b/lib/Image/ExifTool/WriteCanonRaw.pl
index 16cb431b..cf17f777 100644
--- a/lib/Image/ExifTool/WriteCanonRaw.pl
+++ b/lib/Image/ExifTool/WriteCanonRaw.pl
@@ -128,7 +128,7 @@ sub SaveMakerNotes($)
delete $$et{MAKER_NOTE_INFO};
my $dirEntries = $makerInfo->{Entries};
my $numEntries = scalar(keys %$dirEntries);
- my $fixup = new Image::ExifTool::Fixup;
+ my $fixup = Image::ExifTool::Fixup->new;
return unless $numEntries;
# build the MakerNotes directory
my $makerNotes = Set16u($numEntries);
diff --git a/lib/Image/ExifTool/WriteExif.pl b/lib/Image/ExifTool/WriteExif.pl
index 23a7ca68..7c5d5214 100644
--- a/lib/Image/ExifTool/WriteExif.pl
+++ b/lib/Image/ExifTool/WriteExif.pl
@@ -171,9 +171,9 @@ sub RebuildMakerNotes($$$)
my $saveOrder = GetByteOrder();
my $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo);
if (defined $loc) {
- my $makerFixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
+ my $makerFixup = $subdirInfo{Fixup} = Image::ExifTool::Fixup->new;
# create new exiftool object to rewrite the directory without changing it
- my $newTool = new Image::ExifTool;
+ my $newTool = Image::ExifTool->new;
$newTool->Options(
IgnoreMinorErrors => $$et{OPTIONS}{IgnoreMinorErrors},
FixBase => $$et{OPTIONS}{FixBase},
@@ -565,7 +565,7 @@ sub WriteExif($$$)
my $firstBase = $base;
my $raf = $$dirInfo{RAF};
my $dirName = $$dirInfo{DirName} || 'unknown';
- my $fixup = $$dirInfo{Fixup} || new Image::ExifTool::Fixup;
+ my $fixup = $$dirInfo{Fixup} || Image::ExifTool::Fixup->new;
my $imageDataFlag = $$dirInfo{ImageData} || '';
my $verbose = $et->Options('Verbose');
my $out = $et->Options('TextOut');
@@ -745,7 +745,7 @@ sub WriteExif($$$)
my $valBuff = ''; # buffer for value data
my @valFixups; # list of fixups for offsets in valBuff
# fixup for offsets in dirBuff
- my $dirFixup = new Image::ExifTool::Fixup;
+ my $dirFixup = Image::ExifTool::Fixup->new;
my $entryBasedFixup;
my $lastTagID = -1;
my ($oldInfo, $oldFormat, $oldFormName, $oldCount, $oldSize, $oldValue, $oldImageData);
@@ -896,7 +896,7 @@ Entry: for (;;) {
TagInfo => $oldInfo || $tmpInfo,
Offset => $base + $valuePtr + $dataPos,
Size => $oldSize,
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
},
$invalidPreview = 2;
# remove SubDirectory to prevent processing (for now)
@@ -1348,7 +1348,7 @@ NoOverwrite: next if $isNew > 0;
# create empty source directory
my %sourceDir = (
Parent => $dirName,
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
);
$sourceDir{DirName} = $$newInfo{Groups}{1} if $$newInfo{SubIFD};
$newValue = $et->WriteDirectory(\%sourceDir, $subTable);
@@ -1509,7 +1509,7 @@ NoOverwrite: next if $isNew > 0;
}
if (defined $loc) {
# we need fixup data for this subdirectory
- $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
+ $subdirInfo{Fixup} = Image::ExifTool::Fixup->new;
# rewrite maker notes
my $changed = $$et{CHANGED};
$subdir = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
@@ -1673,7 +1673,7 @@ NoOverwrite: next if $isNew > 0;
Name => $$newInfo{Name},
TagInfo => $newInfo,
Parent => $dirName,
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
RAF => $raf,
Subdir => $subdir,
# set ImageData only for 1st level SubIFD's
@@ -1782,7 +1782,7 @@ NoOverwrite: next if $isNew > 0;
#### eval Base ($start,$base)
$subdirBase += eval $$subdir{Base};
}
- my $subFixup = new Image::ExifTool::Fixup;
+ my $subFixup = Image::ExifTool::Fixup->new;
my %subdirInfo = (
Base => $subdirBase,
DataPt => $valueDataPt,
@@ -1995,7 +1995,7 @@ NoOverwrite: next if $isNew > 0;
# hold onto the PreviewImage until we can determine if it fits
$$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
Data => $$newValuePt,
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
};
$$et{PREVIEW_INFO}{ChangeBase} = 1 if $$newInfo{ChangeBase};
if ($$newInfo{IsOffset} and $$newInfo{IsOffset} eq '2') {
@@ -2017,7 +2017,7 @@ NoOverwrite: next if $isNew > 0;
$valBuff .= $$newValuePt; # add value data to buffer
# must save a fixup pointer for every pointer in the directory
if ($entryBased) {
- $entryBasedFixup or $entryBasedFixup = new Image::ExifTool::Fixup;
+ $entryBasedFixup or $entryBasedFixup = Image::ExifTool::Fixup->new;
$entryBasedFixup->AddFixup(length($dirBuff) + 8, $dataTag);
} else {
$dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
@@ -2451,7 +2451,7 @@ NoOverwrite: next if $isNew > 0;
$newOffset += $blockSize; # data comes after other deferred data
# create fixup for SubIFD ImageData
if ($imageDataFlag eq 'SubIFD' and not $subIfdDataFixup) {
- $subIfdDataFixup = new Image::ExifTool::Fixup;
+ $subIfdDataFixup = Image::ExifTool::Fixup->new;
$imageData[-1][4] = $subIfdDataFixup;
}
$size += $pad; # account for pad byte if necessary
@@ -2522,7 +2522,7 @@ NoOverwrite: next if $isNew > 0;
# hold onto the PreviewImage until we can determine if it fits
$$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
Data => $buff,
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
};
if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '2') {
$$et{PREVIEW_INFO}{NoBaseShift} = 1;
@@ -2603,7 +2603,7 @@ NoOverwrite: next if $isNew > 0;
$fixup->AddFixup($entry + 8);
# create special fixup for SubIFD data
if ($imageDataFlag eq 'SubIFD') {
- my $subIfdDataFixup = new Image::ExifTool::Fixup;
+ my $subIfdDataFixup = Image::ExifTool::Fixup->new;
$subIfdDataFixup->AddFixup($entry + 8);
# save fixup in imageData list
$$blockInfo[4] = $subIfdDataFixup;
@@ -2668,7 +2668,7 @@ NoOverwrite: next if $isNew > 0;
} else {
# Doesn't fit, or we still don't know, so save fixup information
# and put the preview at the end of the file
- $$previewInfo{Fixup} or $$previewInfo{Fixup} = new Image::ExifTool::Fixup;
+ $$previewInfo{Fixup} or $$previewInfo{Fixup} = Image::ExifTool::Fixup->new;
$$previewInfo{Fixup}->AddFixup($fixup);
}
} elsif (defined $newData and $deleteAll) {
diff --git a/lib/Image/ExifTool/WritePDF.pl b/lib/Image/ExifTool/WritePDF.pl
index 3bf7d921..b2b222da 100644
--- a/lib/Image/ExifTool/WritePDF.pl
+++ b/lib/Image/ExifTool/WritePDF.pl
@@ -290,7 +290,7 @@ sub WritePDF($$)
$raf->Seek($pos, 0);
# create a new ExifTool object and use it to read PDF and XMP information
- my $newTool = new Image::ExifTool;
+ my $newTool = Image::ExifTool->new;
$newTool->Options(List => 1);
$newTool->Options(Password => $et->Options('Password'));
$newTool->Options(NoPDFList => $et->Options('NoPDFList'));
diff --git a/lib/Image/ExifTool/WriteQuickTime.pl b/lib/Image/ExifTool/WriteQuickTime.pl
index c67ed464..6dcc9fff 100644
--- a/lib/Image/ExifTool/WriteQuickTime.pl
+++ b/lib/Image/ExifTool/WriteQuickTime.pl
@@ -785,7 +785,7 @@ sub WriteQuickTime($$$)
my ($rtnVal, $rtnErr) = $dataPt ? (undef, undef) : (1, 0);
if ($dataPt) {
- $raf = new File::RandomAccess($dataPt);
+ $raf = File::RandomAccess->new($dataPt);
} else {
return 0 unless $raf;
}
diff --git a/lib/Image/ExifTool/WriteXMP.pl b/lib/Image/ExifTool/WriteXMP.pl
index 12fa405e..9cd75ce9 100644
--- a/lib/Image/ExifTool/WriteXMP.pl
+++ b/lib/Image/ExifTool/WriteXMP.pl
@@ -1083,6 +1083,8 @@ sub WriteXMP($$;$)
# delete all structure (or pseudo-structure) elements
require 'Image/ExifTool/XMPStruct.pl';
($deleted, $added, $existed) = DeleteStruct($et, \%capture, \$path, $nvHash, \$changed);
+ # don't add if it didn't exist and not IsCreating and Avoid
+ undef $added if not $existed and not $$nvHash{IsCreating} and $$tagInfo{Avoid};
next unless $deleted or $added or $et->IsOverwriting($nvHash);
next if $existed and $$nvHash{CreateOnly};
} elsif ($cap) {
@@ -1262,8 +1264,8 @@ sub WriteXMP($$;$)
# check to see if we want to create this tag
# (create non-avoided tags in XMP data files by default)
my $isCreating = ($$nvHash{IsCreating} or (($isStruct or
- ($preferred and not $$tagInfo{Avoid} and
- not defined $$nvHash{Shift})) and not $$nvHash{EditOnly}));
+ ($preferred and not defined $$nvHash{Shift})) and
+ not $$tagInfo{Avoid} and not $$nvHash{EditOnly}));
# don't add new values unless...
# ...tag existed before and was deleted, or we added it to a list
diff --git a/lib/Image/ExifTool/Writer.pl b/lib/Image/ExifTool/Writer.pl
index fa919ac6..f28547af 100644
--- a/lib/Image/ExifTool/Writer.pl
+++ b/lib/Image/ExifTool/Writer.pl
@@ -26,6 +26,7 @@ sub RemoveNewValuesForGroup($$);
sub GetWriteGroup1($$);
sub Sanitize($$);
sub ConvInv($$$$$;$$);
+sub PushValue($$$;$);
my $loadedAllTables; # flag indicating we loaded all tables
my $advFmtSelf; # ExifTool object during evaluation of advanced formatting expr
@@ -1260,7 +1261,7 @@ sub SetNewValuesFromFile($$;@)
}
# expand shortcuts
@setTags and ExpandShortcuts(\@setTags);
- my $srcExifTool = new Image::ExifTool;
+ my $srcExifTool = Image::ExifTool->new;
# set flag to indicate we are being called from inside SetNewValuesFromFile()
$$srcExifTool{TAGS_FROM_FILE} = 1;
# synchronize and increment the file sequence number
@@ -1582,7 +1583,7 @@ SET: foreach $set (@setList) {
my $opts = $$set[3];
# handle expressions
if ($$opts{EXPR}) {
- my $val = $srcExifTool->InsertTagValues(\@tags, $$set[1], 'Error');
+ my $val = $srcExifTool->InsertTagValues($$set[1], \@tags, 'Error');
my $err = $$srcExifTool{VALUE}{Error};
if ($err) {
# pass on any error as a warning unless it is suppressed
@@ -2432,7 +2433,7 @@ sub WriteInfo($$;$$)
#
until ($$self{VALUE}{Error}) {
# create random access file object (disable seek test in case of straight copy)
- $raf or $raf = new File::RandomAccess($inRef, 1);
+ $raf or $raf = File::RandomAccess->new($inRef, 1);
$raf->BinMode();
if ($numNew == $numPseudo) {
$rtnVal = 1;
@@ -2703,7 +2704,7 @@ sub GetAllTags(;$)
my (%allTags, @groups);
@groups = split ':', $group if $group;
- my $et = new Image::ExifTool;
+ my $et = Image::ExifTool->new;
LoadAllTables(); # first load all our tables
my @tableNames = keys %allTables;
@@ -2748,7 +2749,7 @@ sub GetWritableTags(;$)
my (%writableTags, @groups);
@groups = split ':', $group if $group;
- my $et = new Image::ExifTool;
+ my $et = Image::ExifTool->new;
LoadAllTables();
my @tableNames = keys %allTables;
@@ -3125,10 +3126,36 @@ Conv: for (;;) {
}
#------------------------------------------------------------------------------
+# Dereference value and push onto list
+# Inputs: 0) ExifTool ref, 1) value, 2) list ref, 3) flag to push MissingTagValue for undef value
+sub PushValue($$$;$)
+{
+ local $_;
+ my ($self, $val, $list, $missing) = @_;
+ if (ref $val eq 'ARRAY' and ref $$val[0] ne 'HASH') {
+ $self->PushValue($_, $list, $missing) foreach @$val;
+ } elsif (ref $val eq 'SCALAR') {
+ if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
+ push @$list, $$val;
+ } else {
+ push @$list, 'Binary data ' . length($$val) . ' bytes';
+ }
+ } elsif (ref $val eq 'HASH' or ref $val eq 'ARRAY') {
+ require 'Image/ExifTool/XMPStruct.pl';
+ push @$list, Image::ExifTool::XMP::SerializeStruct($self, $val);
+ } elsif (not defined $val) {
+ my $mval = $$self{OPTIONS}{MissingTagValue};
+ push @$list, $mval if $missing and defined $mval;
+ } else {
+ push @$list, $val;
+ }
+}
+
+#------------------------------------------------------------------------------
# Convert tag names to values or variables in a string
# (eg. '${EXIF:ISO}x $$' --> '100x $' without hash ref, or "$info{'EXIF:ISO'}x $" with)
-# Inputs: 0) ExifTool object ref, 1) reference to list of found tags
-# 2) string with embedded tag names, 3) Options:
+# Inputs: 0) ExifTool object ref, 1) string with embedded tag names,
+# 2) reference to list of found tags or undef to use FOUND_TAGS, 3) Options:
# undef - set missing tags to ''
# 'Error' - issue minor error on missing tag (and return undef)
# 'Warn' - issue minor warning on missing tag (and return undef)
@@ -3145,20 +3172,22 @@ Conv: for (;;) {
# - advanced feature allows Perl expressions inside braces (eg. '${model;tr/ //d}')
# - an error/warning in an advanced expression ("${TAG;EXPR}") generates an error
# if option set to 'Error', or a warning otherwise
-sub InsertTagValues($$$;$$$)
+sub InsertTagValues($$;$$$$)
{
local $_;
- my ($self, $foundTags, $line, $opt, $docGrp, $cache) = @_;
+ my ($self, $line, $foundTags, $opt, $docGrp, $cache) = @_;
my $rtnStr = '';
my ($docNum, $tag);
+
if ($docGrp) {
$docNum = $docGrp =~ /(\d+)$/ ? $1 : 0;
} else {
undef $cache; # no cache if no document groups
}
+ $foundTags or $foundTags = $$self{FOUND_TAGS} || [];
while ($line =~ s/(.*?)\$(\{\s*)?([-\w]*\w|\$|\/)//s) {
my ($pre, $bra, $var) = ($1, $2, $3);
- my (@tags, $val, $tg, @val, $type, $expr, $didExpr, $level, $asList);
+ my (@tags, $tg, $val, @val, $type, $expr, $didExpr, $level, $asList);
# "$$" represents a "$" symbol, and "$/" is a newline
if ($var eq '$' or $var eq '/') {
$line =~ s/^\s*\}// if $bra;
@@ -3261,15 +3290,24 @@ sub InsertTagValues($$$;$$$)
} elsif (defined $$et{OPTIONS}{UserParam}{$lcTag}) {
$val = $$et{OPTIONS}{UserParam}{$lcTag};
} elsif ($tag =~ /(.*):(.+)/) {
- my $group;
+ my ($group, @matches);
($group, $tag) = ($1, $2);
- if (lc $tag eq 'all') {
- # see if any tag from the specified group exists
- my $match = $et->GroupMatches($group, $fileTags);
- $val = $match ? 1 : 0;
+ # join values of all matching tags if "All" group is used
+ # (and remove "All" from group prefix)
+ if ($group =~ s/(^|:)(all|\*)(:|$)/$1 and $3/ei) {
+ if (lc $tag eq 'all') {
+ @matches = $group ? $et->GroupMatches($group, $fileTags) : @$fileTags;
+ } else {
+ @matches = grep /^$tag(\s|$)/i, @$fileTags;
+ @matches = $et->GroupMatches($group, \@matches) if $group;
+ }
+ $self->PushValue(scalar $et->GetValue($_, $type), \@val) foreach @matches;
+ } elsif (lc $tag eq 'all') {
+ # return "1" if any tag from the specified group exists
+ $val = $et->GroupMatches($group, $fileTags) ? 1 : 0;
} else {
# find the specified tag
- my @matches = grep /^$tag(\s|$)/i, @$fileTags;
+ @matches = grep /^$tag(\s|$)/i, @$fileTags;
@matches = $et->GroupMatches($group, \@matches);
foreach $tg (@matches) {
if (defined $val and $tg =~ / \((\d+)\)$/) {
@@ -3298,31 +3336,15 @@ sub InsertTagValues($$$;$$$)
}
}
$self->Options(ListJoin => $oldListJoin) if $asList;
- if (ref $val eq 'ARRAY') {
- push @val, @$val;
- undef $val;
- last unless @tags;
- } elsif (ref $val eq 'SCALAR') {
- if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
- $val = $$val;
- } else {
- $val = 'Binary data ' . length($$val) . ' bytes';
- }
- } elsif (ref $val eq 'HASH') {
- require 'Image/ExifTool/XMPStruct.pl';
- $val = Image::ExifTool::XMP::SerializeStruct($self, $val);
- } elsif (not defined $val) {
- $val = $$self{OPTIONS}{MissingTagValue} if $asList;
- }
- last unless @tags;
- push @val, $val if defined $val;
+ $self->PushValue($val, \@val, $asList);
undef $val;
+ last unless @tags;
}
if (@val) {
- push @val, $val if defined $val;
+ $self->PushValue($val, \@val) if defined $val;
$val = join $$self{OPTIONS}{ListSep}, @val;
- } else {
- push @val, $val if defined $val; # (so the eval has access to @val if required)
+ } elsif (defined $val) {
+ $self->PushValue($val, \@val); # (so the eval has access to @val if required)
}
# evaluate advanced formatting expression if given (eg. "${TAG;EXPR}")
if (defined $expr and defined $val) {
@@ -3395,6 +3417,7 @@ sub InsertTagValues($$$;$$$)
#------------------------------------------------------------------------------
# Reformat date/time value in $_ based on specified format string
# Inputs: 0) date/time format string
+# Returns: Reformatted date/time string
sub DateFmt($)
{
my $et = bless { OPTIONS => { DateFormat => shift, StrictDate => 1 } };
@@ -3406,6 +3429,7 @@ sub DateFmt($)
$_ = $et->ConvertDateTime($_);
defined $_ or warn "Error converting date/time\n";
$$advFmtSelf{GLOBAL_TIME_OFFSET} = $$et{GLOBAL_TIME_OFFSET} if $shift;
+ return $_;
}
#------------------------------------------------------------------------------
@@ -3515,7 +3539,7 @@ sub CreateDirectory($$)
}
unless ($k32CreateDir) {
return -1 if defined $k32CreateDir;
- $k32CreateDir = new Win32::API('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
+ $k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
unless ($k32CreateDir) {
$self->Warn('Error calling Win32::API::CreateDirectoryW');
$k32CreateDir = 0;
@@ -6233,7 +6257,7 @@ sub WriteJPEG($$)
last unless $$editDirs{CIFF};
my $newData = '';
my %dirInfo = (
- RAF => new File::RandomAccess($segDataPt),
+ RAF => File::RandomAccess->new($segDataPt),
OutFile => \$newData,
);
require Image::ExifTool::CanonRaw;
@@ -6952,7 +6976,7 @@ sub SetFileTime($$;$$$$)
}
unless ($k32SetFileTime) {
return 0 if defined $k32SetFileTime;
- $k32SetFileTime = new Win32::API('KERNEL32', 'SetFileTime', 'NPPP', 'I');
+ $k32SetFileTime = Win32::API->new('KERNEL32', 'SetFileTime', 'NPPP', 'I');
unless ($k32SetFileTime) {
$self->Warn('Error calling Win32::API::SetFileTime');
$k32SetFileTime = 0;
@@ -7196,7 +7220,7 @@ sub WriteBinaryData($$$)
$$self{HiddenData} = {
Offset => $offset,
Size => $size,
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
Base => $$dirInfo{Base},
};
next;
@@ -7205,7 +7229,7 @@ sub WriteBinaryData($$$)
next unless $$tagInfo{DataTag} eq 'PreviewImage' and $$self{FILE_TYPE} eq 'JPEG';
my $previewInfo = $$self{PREVIEW_INFO};
$previewInfo or $previewInfo = $$self{PREVIEW_INFO} = {
- Fixup => new Image::ExifTool::Fixup,
+ Fixup => Image::ExifTool::Fixup->new,
};
# set flag indicating we are using short pointers
$$previewInfo{IsShort} = 1 unless $format eq 'int32u';
diff --git a/lib/Image/ExifTool/ZIP.pm b/lib/Image/ExifTool/ZIP.pm
index 5ee9d54f..48e44a6c 100644
--- a/lib/Image/ExifTool/ZIP.pm
+++ b/lib/Image/ExifTool/ZIP.pm
@@ -20,7 +20,7 @@ use strict;
use vars qw($VERSION $warnString);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.30';
+$VERSION = '1.31';
sub WarnProc($) { $warnString = $_[0]; }
@@ -367,7 +367,7 @@ sub ProcessRAR($$)
# read the header and create new RAF object for reading it
my $header;
$raf->Read($header, $headSize) == $headSize or last;
- my $rafHdr = new File::RandomAccess(\$header);
+ my $rafHdr = File::RandomAccess->new(\$header);
my $headType = ReadULEB($rafHdr); # get header type
if ($headType == 4) { # encryption block
@@ -550,14 +550,14 @@ sub ProcessZIP($$)
} elsif (eval { require IO::String }) {
# read the whole file into memory (what else can I do?)
$raf->Slurp();
- $fh = new IO::String ${$raf->{BUFF_PT}};
+ $fh = IO::String->new(${$raf->{BUFF_PT}});
} else {
my $type = $raf->{FILE_PT} ? 'pipe or socket' : 'scalar reference';
$et->Warn("Install IO::String to decode compressed ZIP information from a $type");
last;
}
$et->VPrint(1, " --- using Archive::Zip ---\n");
- $zip = new Archive::Zip;
+ $zip = Archive::Zip->new;
# catch all warnings! (Archive::Zip is bad for this)
local $SIG{'__WARN__'} = \&WarnProc;
my $status = $zip->readFromFileHandle($fh);
@@ -568,8 +568,8 @@ sub ProcessZIP($$)
# a failed test with Perl 5.6.2 GNU/Linux 2.6.32-5-686 i686-linux-64int-ld
$raf->Seek(0,0);
$raf->Slurp();
- $fh = new IO::String ${$raf->{BUFF_PT}};
- $zip = new Archive::Zip;
+ $fh = IO::String->new(${$raf->{BUFF_PT}});
+ $zip = Archive::Zip->new;
$status = $zip->readFromFileHandle($fh);
}
if ($status) {
diff --git a/perl-Image-ExifTool.spec b/perl-Image-ExifTool.spec
index 496db53c..736b8825 100644
--- a/perl-Image-ExifTool.spec
+++ b/perl-Image-ExifTool.spec
@@ -1,6 +1,6 @@
Summary: perl module for image data extraction
Name: perl-Image-ExifTool
-Version: 12.73
+Version: 12.74
Release: 1
License: Artistic/GPL
Group: Development/Libraries/Perl
diff --git a/pp_build_exe.args b/pp_build_exe.args
index de2bc17a..74aafdfd 100644
--- a/pp_build_exe.args
+++ b/pp_build_exe.args
@@ -21,10 +21,10 @@
# 10) Copy zip archive to web servers.
# 11) Update zip file version in link and text of html/index.html.
#------------------------------------------------------------------------------
--T exiftool-12.73
-#--info=FileVersion=12.7.3.0
-#--info=ProductVersion=12.7.3.0
-##"--info=Build Date=2024:01:10 13:53:16-05:00"
+-T exiftool-12.74
+#--info=FileVersion=12.7.4.0
+#--info=ProductVersion=12.7.4.0
+##"--info=Build Date=2024:01:23 08:16:18-05:00"
##"--info=Bundled Perl Version=ActivePerl 5.24.0"
##"--info=LegalCopyright=Copyright (c) 2003-2024, Phil Harvey"
##"--info=ProductName=ExifTool"
diff --git a/t/ExifTool.t b/t/ExifTool.t
index 9e936eaa..a0828592 100644
--- a/t/ExifTool.t
+++ b/t/ExifTool.t
@@ -232,7 +232,7 @@ my $testnum = 1;
my $exifTool = Image::ExifTool->new;
my @foundTags;
$exifTool->ImageInfo('t/images/ExifTool.jpg', \@foundTags);
- my $str = $exifTool->InsertTagValues(\@foundTags, '${ifd0:model;tr/i/_/} - $1ciff:3main:model');
+ my $str = $exifTool->InsertTagValues('${ifd0:model;tr/i/_/} - $1ciff:3main:model', \@foundTags);
my $testfile = "t/ExifTool_$testnum";
open(TESTFILE,">$testfile.failed");
my $oldSep = $/;
@@ -370,7 +370,7 @@ my $testnum = 1;
my @foundTags;
$exifTool->SetAlternateFile(File010 => 't/images/Nikon.jpg');
$exifTool->ImageInfo('t/images/Canon.jpg', \@foundTags);
- my $val = $exifTool->InsertTagValues(\@foundTags, '$file010:make - $make');
+ my $val = $exifTool->InsertTagValues('$file010:make - $make', \@foundTags);
my $testfile = "t/${testname}_$testnum.failed";
my $goodfile = "t/${testname}_$testnum.out";
open OUT, ">$testfile";
diff --git a/t/TestLib.pm b/t/TestLib.pm
index 6caac917..9a56a5c9 100644
--- a/t/TestLib.pm
+++ b/t/TestLib.pm
@@ -378,7 +378,7 @@ sub writeCheck($$$;$$$$)
$srcfile or $srcfile = "t/images/$testname.jpg";
my ($ext) = ($srcfile =~ /\.(.+?)$/);
my $testfile = "t/${testname}_${testnum}_failed.$ext";
- my $exifTool = new Image::ExifTool;
+ my $exifTool = Image::ExifTool->new;
my @tags;
if (ref $onlyWritten eq 'ARRAY') {
@tags = @$onlyWritten;
diff --git a/t/XMP.t b/t/XMP.t
index 7167c18d..b7665617 100644
--- a/t/XMP.t
+++ b/t/XMP.t
@@ -571,18 +571,20 @@ my $testnum = 1;
print "ok $testnum\n";
}
-# test 46: Test the advanced-formatting '@' feature on an XMP:Subject list
+# test 46: Test the advanced-formatting '@' feature and "All" in the source group
{
++$testnum;
my $exifTool = Image::ExifTool->new;
$exifTool->Options(ListSplit => ', ');
- my $cpy = 'subject<${subject@;/^Test/ ? $_=undef : s/Tool$//}';
- $exifTool->SetNewValuesFromFile('t/images/XMP.jpg', $cpy);
+ my $subj = 'subject<${subject@;/^Test/ ? $_=undef : s/Tool$//}';
+ my $keyw = 'creator<${Adobe:all:all@;s/n/N/;$_=undef if /Y/}';
+ # (exclude Adobe tag because the Adobe segment would be extracted as a block when copying)
+ $exifTool->SetNewValuesFromFile('t/images/XMP.jpg', $subj, '-adobe', $keyw);
$testfile = "t/${testname}_${testnum}_failed.xmp";
unlink $testfile;
writeInfo($exifTool, undef, $testfile);
$exifTool->Options(ListSep => ' // ');
- my $info = $exifTool->ImageInfo($testfile, 'Subject');
+ my $info = $exifTool->ImageInfo($testfile, 'Subject', 'Creator');
if (check($exifTool, $info, $testname, $testnum)) {
unlink $testfile;
} else {
diff --git a/t/XMP_46.out b/t/XMP_46.out
index fb5ffed0..48f4119f 100644
--- a/t/XMP_46.out
+++ b/t/XMP_46.out
@@ -1 +1,2 @@
+[XMP, XMP-dc, Author] creator - Creator: 100 // (None) // (None)
[XMP, XMP-dc, Image] subject - Subject: Exif // XMP
diff --git a/windows_exiftool b/windows_exiftool
index e58eeb3d..4297e959 100755
--- a/windows_exiftool
+++ b/windows_exiftool
@@ -11,7 +11,7 @@ use strict;
use warnings;
require 5.004;
-my $version = '12.73';
+my $version = '12.74';
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
my $exePath;
@@ -61,7 +61,7 @@ sub PreserveTime();
sub AbsPath($);
sub MyConvertFileName($$);
sub SuggestedExtension($$$);
-sub LoadPrintFormat($);
+sub LoadPrintFormat($;$);
sub FilenameSPrintf($;$@);
sub NextUnusedFilename($;$);
sub CreateDirectory($);
@@ -263,7 +263,7 @@ my %optArgs = (
'-lang' => 0, # (optional arg; cannot begin with "-")
'-listitem' => 1,
'-o' => 1, '-out' => 1,
- '-p' => 1, '-printformat' => 1,
+ '-p' => 1, '-printformat' => 1, '-p-' => 1, '-printformat-' => 1,
'-P' => 0,
'-password' => 1,
'-require' => 1,
@@ -586,7 +586,7 @@ if ($^O eq 'MSWin32' and eval { require File::Glob }) {
$doGlob = 1;
}
-$mt = new Image::ExifTool; # create ExifTool object
+$mt = Image::ExifTool->new; # create ExifTool object
# don't extract duplicates by default unless set by UserDefined::Options
$mt->Options(Duplicates => 0) unless %Image::ExifTool::UserDefined::Options
@@ -1146,10 +1146,10 @@ for (;;) {
}
/^overwrite_original$/i and $overwriteOrig = 1, next;
/^overwrite_original_in_place$/i and $overwriteOrig = 2, next;
- if (/^p$/ or $a eq 'printformat') {
+ if (/^p(-?)$/ or /^printformat(-?)$/i) {
my $fmt = shift;
if ($pass) {
- LoadPrintFormat($fmt);
+ LoadPrintFormat($fmt, $1);
# load MWG module now if necessary
if (not $useMWG and grep /^mwg:/i, @requestTags) {
$useMWG = 1;
@@ -1158,7 +1158,7 @@ for (;;) {
}
} else {
# defer to next pass so the filename charset is available
- push @nextPass, '-p', $fmt;
+ push @nextPass, "-$_", $fmt;
}
next;
}
@@ -1789,7 +1789,7 @@ if (not $altEnc and $mt->Options('Lang') ne 'en' and eval { require Encode }) {
if (@fileOrder) {
my @allFiles;
ProcessFiles($mt, \@allFiles);
- my $sortTool = new Image::ExifTool;
+ my $sortTool = Image::ExifTool->new;
$sortTool->Options(FastScan => $fileOrderFast) if $fileOrderFast;
$sortTool->Options(PrintConv => $mt->Options('PrintConv'));
$sortTool->Options(Duplicates => 0);
@@ -2077,7 +2077,7 @@ sub GetImageInfo($$)
@foundTags = ('*', @tags) if @tags;
$info = $et->ImageInfo(Infile($pipe,$isWriting), \@foundTags, $opts);
foreach $condition (@condition) {
- my $cond = $et->InsertTagValues(\@foundTags, $condition, \%info);
+ my $cond = $et->InsertTagValues($condition, \@foundTags, \%info);
{
# set package so eval'd functions are in Image::ExifTool namespace
package Image::ExifTool;
@@ -2278,7 +2278,7 @@ sub GetImageInfo($$)
my @lines;
my $opt = $type eq 'IF' ? 'Silent' : 'Warn'; # silence "IF" warnings
foreach (@$prf) {
- my $line = $et->InsertTagValues(\@foundTags, $_, $opt, $grp, $cache);
+ my $line = $et->InsertTagValues($_, \@foundTags, $opt, $grp, $cache);
if ($type eq 'IF') {
$skipBody = 1 unless defined $line;
} elsif (defined $line) {
@@ -2711,7 +2711,7 @@ TAG: foreach $tag (@foundTags) {
} elsif ($fixLen == 1) {
$padLen -= length Encode::decode_utf8($desc);
} else {
- my $gcstr = eval { new Unicode::GCString(Encode::decode_utf8($desc)) };
+ my $gcstr = eval { Unicode::GCString->new(Encode::decode_utf8($desc)) };
if ($gcstr) {
$padLen -= $gcstr->columns;
} else {
@@ -3637,7 +3637,7 @@ sub Infile($;$)
if ($rafStdin) {
$rafStdin->Seek(0); # rewind
} elsif (open RAF_STDIN, '-') {
- $rafStdin = new File::RandomAccess(\*RAF_STDIN);
+ $rafStdin = File::RandomAccess->new(\*RAF_STDIN);
$rafStdin->BinMode();
}
return $rafStdin if $rafStdin;
@@ -4114,12 +4114,12 @@ sub SuggestedExtension($$$)
#------------------------------------------------------------------------------
# Load print format file
-# Inputs: 0) file name
+# Inputs: 0) file name, 1) flag to avoid adding newline to input argument
# - saves lines of file to %printFmt list
# - adds tag names to @tags list
-sub LoadPrintFormat($)
+sub LoadPrintFormat($;$)
{
- my $arg = shift;
+ my ($arg, $noNL) = @_;
if (not defined $arg) {
Error "Must specify file or expression for -p option\n";
} elsif ($arg !~ /\n/ and -f $arg and $mt->Open(\*FMT_FILE, $arg)) {
@@ -4128,7 +4128,8 @@ sub LoadPrintFormat($)
}
close(FMT_FILE);
} else {
- AddPrintFormat($arg . "\n");
+ $arg .= "\n" unless $noNL;
+ AddPrintFormat($arg);
}
}
@@ -4292,7 +4293,7 @@ sub CreateDirectory($)
return 0;
}
unless ($k32CreateDir) {
- $k32CreateDir = new Win32::API('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
+ $k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
}
$success = $k32CreateDir->Call($d2, 0) if $k32CreateDir;
} else {
@@ -4759,7 +4760,7 @@ OPTIONS
-lang [LANG] Set current language
-listItem INDEX Extract specific item from a list
-n (--printConv) No print conversion
- -p FMTFILE (-printFormat) Print output in specified format
+ -p[-] STR (-printFormat) Print output in specified format
-php Export tags as a PHP Array
-s[NUM] (-short) Short output format (-s for tag names)
-S (-veryShort) Very short output format
@@ -5582,23 +5583,24 @@ OPTIONS
> exiftool -Orientation=6 -n a.jpg
> exiftool -Orientation#=6 a.jpg
- -p *FMTFILE* or *STR* (-printFormat)
- Print output in the format specified by the given file or string.
+ -p[-] *STR* or *FMTFILE* (-printFormat)
+ Print output in the format specified by the given string or file.
The argument is interpreted as a string unless a file of that name
exists, in which case the string is loaded from the contents of the
- file. Tag names in the format file or string begin with a "$"
+ file. Tag names in the format string or file begin with a "$"
symbol and may contain leading group names and/or a trailing "#"
(to disable print conversion). Case is not significant. Braces "{}"
may be used around the tag name to separate it from subsequent text
(and must be used if subsequent text begins with an alphanumeric
character, hyphen, underline, colon or number sign). Use $$ to
- represent a "$" symbol, and $/ for a newline.
-
- Multiple -p options may be used, each contributing a line (or more)
- of text to the output. Lines beginning with "#[HEAD]" and "#[TAIL]"
- are output before the first processed file and after the last
- processed file respectively. Lines beginning with "#[SECT]" and
- "#[ENDS]" are output before and after each section of files. A
+ represent a "$" symbol, and $/ for a newline. When the string
+ argument is used (ie. *STR*), a newline is added to the end of the
+ string unless -p- is specified.
+
+ Multiple -p options may be used. Lines beginning with "#[HEAD]" and
+ "#[TAIL]" are output before the first processed file and after the
+ last processed file respectively. Lines beginning with "#[SECT]"
+ and "#[ENDS]" are output before and after each section of files. A
section is defined as a group of consecutive files with the same
section header (eg. files are grouped by directory if "#[SECT]"
contains $directory). Lines beginning with "#[BODY]" and lines not
@@ -5620,16 +5622,22 @@ OPTIONS
produces output like this:
- -- Generated by ExifTool 12.73 --
+ -- Generated by ExifTool 12.74 --
File: a.jpg - 2003:10:31 15:44:19
(f/5.6, 1/60s, ISO 100)
File: b.jpg - 2006:05:23 11:57:38
(f/8.0, 1/13s, ISO 100)
-- end --
- The values of List-type tags with multiple items and Shortcut tags
- representing multiple tags are joined according the -sep option
- setting when interpolated in the string.
+ The values of List-type tags with multiple items, Shortcut tags
+ representing multiple tags, and matching tags when the "All" group
+ is specified are joined according the -sep option setting when
+ interpolated in the string. (Note that when "All" is used as a
+ group name, dupicate tags are included regardless of the Duplicates
+ option setting.) When "All" is used as a tag name, a value of 1 is
+ returned if any tag exists in the specified group, or 0 otherwise
+ (unless the "All" group is also specified, in which case the values
+ of all matching tags are joined).
When -ee (-extractEmbedded) is combined with -p, embedded documents
are effectively processed as separate input files.
@@ -6556,7 +6564,9 @@ OPTIONS
with "^=". If *OPT* is not specified a list of available options is
returned. The option name is not case senstive, but the option
values are. See Image::ExifTool Options for option details. This
- overrides API options set via the config file.
+ overrides API options set via the config file. Note that the
+ exiftool app sets some API options internally, and attempts to
+ change these via the command line will have no effect.
-common_args
Specifies that all arguments following this option are common to