summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorexiftool <phil@u88.n24.queensu.ca>2014-09-26 08:04:03 -0400
committerexiftool <phil@u88.n24.queensu.ca>2014-09-26 08:04:03 -0400
commit7b956a15f5611a45bbeae4b1dab07822a4265ae5 (patch)
tree15609a3f57eaa993376d6a3be30ba0928d838c95
parent221edc28385f48dfc92216536737bd2cec48c608 (diff)
Update to 9.72
-rw-r--r--Changes10
-rwxr-xr-xexiftool4
-rw-r--r--html/TagNames/Canon.html6
-rw-r--r--html/TagNames/Nikon.html47
-rw-r--r--html/TagNames/Pentax.html20
-rw-r--r--html/TagNames/Sony.html5
-rw-r--r--html/exiftool_pod.html2
-rw-r--r--html/history.html11
-rw-r--r--html/index.html12
-rw-r--r--html/struct.html26
-rw-r--r--lib/Image/ExifTool.pm14
-rw-r--r--lib/Image/ExifTool/Canon.pm6
-rw-r--r--lib/Image/ExifTool/Nikon.pm201
-rw-r--r--lib/Image/ExifTool/Pentax.pm8
-rw-r--r--lib/Image/ExifTool/Samsung.pm75
-rw-r--r--lib/Image/ExifTool/Sony.pm1
-rw-r--r--lib/Image/ExifTool/TagNames.pod2
-rw-r--r--perl-Image-ExifTool.spec2
-rw-r--r--t/images/ExifTool.jpgbin25341 -> 25341 bytes
19 files changed, 355 insertions, 97 deletions
diff --git a/Changes b/Changes
index dad94492..d58acfc2 100644
--- a/Changes
+++ b/Changes
@@ -7,6 +7,16 @@ RSS feed: http://owl.phy.queensu.ca/~phil/exiftool/rss.xml
Note: The most recent production release is Version 9.70. (Other versions are
considered development releases, and are not uploaded to CPAN.)
+Sept. 26, 2014 - Version 9.72
+
+ - Added a few new Pentax ISO values
+ - Added a new CanonModelID and SonyModelID (thanks LibRaw)
+ - Added a new Canon LensType
+ - Decode AF points for some newer Nikon 1 cameras (thanks Chris Reimold for
+ his help, and Graham Woolf for the samples)
+ - Improved verbose output for recently decoded Samsung trailer
+ - Fixed Samsung trailer writer to properly update offsets in the QDIO block
+
Sept. 20, 2014 - Version 9.71
- Added a couple of mew CanonModelID's (thanks LibRaw)
diff --git a/exiftool b/exiftool
index a4e3be3e..f036095f 100755
--- a/exiftool
+++ b/exiftool
@@ -12,7 +12,7 @@
use strict;
require 5.004;
-my $version = '9.71';
+my $version = '9.72';
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
my $exeDir;
@@ -4429,7 +4429,7 @@ with this command:
produces output like this:
- -- Generated by ExifTool 9.71 --
+ -- Generated by ExifTool 9.72 --
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
diff --git a/html/TagNames/Canon.html b/html/TagNames/Canon.html
index 75a126af..58757c72 100644
--- a/html/TagNames/Canon.html
+++ b/html/TagNames/Canon.html
@@ -684,6 +684,7 @@
</tr><tr><td class=r>0x3690000</td><td>= PowerShot ELPH 135 / IXUS 145 / IXY 120</td>
</tr><tr><td class=r>0x3700000</td><td>= PowerShot ELPH 340 HS / IXUS 265 HS / IXY 630</td>
</tr><tr><td class=r>0x3710000</td><td>= PowerShot ELPH 150 IS / IXUS 155 / IXY 140</td>
+</tr><tr><td class=r>0x3760000</td><td>= PowerShot SX520 HS</td>
</tr><tr><td class=r>0x3780000</td><td>= PowerShot G7 X</td>
</tr><tr><td class=r>0x4040000</td><td>= PowerShot G1</td>
</tr><tr><td class=r>0x6040000</td><td>= PowerShot S100 / Digital IXUS / IXY Digital</td>
@@ -1375,7 +1376,8 @@ attempting to identify the specific lens model.</p>
</tr><tr><td>169.7</td><td>= Sigma 35mm f/1.4 DG HSM</td>
</tr><tr><td>170</td><td>= Canon EF 200mm f/2.8L II</td>
</tr><tr><td>171</td><td>= Canon EF 300mm f/4L</td>
-</tr><tr><td>172</td><td>= Canon EF 400mm f/5.6L</td>
+</tr><tr><td>172</td><td>= Canon EF 400mm f/5.6L or Sigma Lens</td>
+</tr><tr><td>172.1</td><td>= Sigma 150-600mm f/5-6.3 DG OS HSM | S</td>
</tr><tr><td>173</td><td>= Canon EF 180mm Macro f/3.5L or Sigma Lens</td>
</tr><tr><td>173.1</td><td>= Sigma 180mm EX HSM Macro f/3.5</td>
</tr><tr><td>173.2</td><td>= Sigma APO Macro 150mm f/2.8 EX DG HSM</td>
@@ -8385,7 +8387,7 @@ SX280.</p>
<hr>
(This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Sep 18, 2014</i>
+<br><i>Last revised Sep 25, 2014</i>
<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
</body>
</html>
diff --git a/html/TagNames/Nikon.html b/html/TagNames/Nikon.html
index 1eee092c..26898f23 100644
--- a/html/TagNames/Nikon.html
+++ b/html/TagNames/Nikon.html
@@ -2940,12 +2940,14 @@ D5200, D7000.</p>
<br>129 = Auto (41 points)
<br>130 = Subject Tracking (41 points)
<br>131 = Face Priority (41 points)</td><td>&nbsp;&nbsp;</td></tr></table>
-<span class=s><span class=n>(ContrastDetectAF On)</span>
- <br>0 = Contrast-detect
+<span class=s><span class=n>(ContrastDetectAF On)</span></span><table class=cols><tr>
+ <td>0 = Contrast-detect
<br>1 = Contrast-detect (normal area)
<br>2 = Contrast-detect (wide area)
<br>3 = Contrast-detect (face priority)
- <br>4 = Contrast-detect (subject tracking)</span></td></tr>
+ <br>4 = Contrast-detect (subject tracking)
+ <br>128 = Single (171 points)</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
<tr class=b>
<td class=r title='6 = 0x6'>6</td>
<td>PhaseDetectAF</td>
@@ -2953,10 +2955,11 @@ D5200, D7000.</p>
<td><span class=s><span class=n>(PrimaryAFPoint and AFPointsUsed below are only valid when this is On)</span></span><table class=cols><tr>
<td>0 = Off
<br>1 = On (51-point)
- <br>2 = On (11-point)</td><td>&nbsp;&nbsp;</td>
- <td>3 = On (39-point)
- <br>4 = On (hybrid)
- <br>5 = On (105-point)</td><td>&nbsp;&nbsp;</td></tr></table>
+ <br>2 = On (11-point)
+ <br>3 = On (39-point)</td><td>&nbsp;&nbsp;</td>
+ <td>4 = On (73-point)
+ <br>5 = On (73-point, new)
+ <br>6 = On (105-point)</td><td>&nbsp;&nbsp;</td></tr></table>
</td></tr>
<tr>
<td class=r title='7 = 0x7'>7</td>
@@ -3069,7 +3072,7 @@ D5200, D7000.</p>
<br>37 = C1
<br>38 = B1
<br>39 = D1</td><td>&nbsp;&nbsp;</td></tr></table>
-<span class=s><span class=n>(models with 135-point AF: Nikon 1 models)</span></span><table class=cols><tr>
+<span class=s><span class=n>(Nikon 1 models with older 135-point AF and 73-point phase-detect AF)</span></span><table class=cols><tr>
<td>0 = (none)
<br>1 = E8 (Center)
<br>2 = D8
@@ -3206,7 +3209,17 @@ D5200, D7000.</p>
<br>133 = G1
<br>134 = H1
<br>135 = I1</td><td>&nbsp;&nbsp;</td></tr></table>
-<span class=s><span class=n>(future models?...)</span>
+<span class=s><span class=n>(Nikon 1 models with newer 135-point AF and 73-point phase-detect AF -- 9
+rows (B-J) and 15 columns (1-15), inside a grid of 11 rows by 15 columns.
+The points are numbered sequentially, with F8 at the center)</span>
+ <br>0 = (none)
+ <br>82 = F8 (Center)
+ <br><span class=n>(Nikon 1 models with 171-point AF and 105-point phase-detect AF -- 9 rows
+(B-J) and 19 columns (2-20), inside a grid of 11 rows by 21 columns. The
+points are numbered sequentially, with F11 at the center)</span>
+ <br>0 = (none)
+ <br>115 = F11 (Center)
+ <br><span class=n>(future models?...)</span>
<br>0 = (none)
<br>1 = Center</span></td></tr>
<tr class=b>
@@ -3215,8 +3228,10 @@ D5200, D7000.</p>
<br>AFPointsUsed
<br>AFPointsUsed
<br>AFPointsUsed
+ <br>AFPointsUsed
+ <br>AFPointsUsed
<br>AFPointsUsed</td>
-<td class=c>undef[7]<br>undef[2]<br>undef[7]<br>undef[17]<br>undef[7]</td>
+<td class=c>undef[7]<br>undef[2]<br>undef[7]<br>undef[17]<br>undef[21]<br>undef[29]<br>undef[7]</td>
<td><span class=s><span class=n>(models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center
point is C6)</span>
<br><span class=n>(models with 11-point AF)</span></span><table class=cols><tr>
@@ -3235,9 +3250,13 @@ point is C6)</span>
<br>Bit 10 = Far Right</td><td>&nbsp;&nbsp;</td></tr></table>
<span class=s><span class=n>(models with 39-point AF -- 5 rows: A1-3, B1-11, C1-11, D1-11, E1-3. Center
point is C6)</span>
- <br><span class=n>(models with 135-point AF -- 9 rows (A-I) and 15 columns (1-15). Center
-point is E8. The odd-numbered columns, columns 2 and 14, and the remaining
-corner points are not used for 41-point AF mode)</span></span></td></tr>
+ <br><span class=n>(older models with 135-point AF -- 9 rows (A-I) and 15 columns (1-15).
+Center point is E8. The odd-numbered columns, columns 2 and 14, and the
+remaining corner points are not used for 41-point AF mode)</span>
+ <br><span class=n>(newer models with 135-point AF -- 9 rows (B-J) and 15 colums (1-15). Center
+point is F8)</span>
+ <br><span class=n>(models with 171-point AF -- 9 rows (B-J) and 19 columns (2-20). Center
+point is F10)</span></span></td></tr>
<tr>
<td class=r title='16 = 0x10'>16</td>
<td>AFImageWidth</td>
@@ -4554,7 +4573,7 @@ ExifTool to choose in these cases (see the
<hr>
(This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Sep 17, 2014</i>
+<br><i>Last revised Sep 25, 2014</i>
<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
</body>
</html>
diff --git a/html/TagNames/Pentax.html b/html/TagNames/Pentax.html
index 0525c0ae..b779211c 100644
--- a/html/TagNames/Pentax.html
+++ b/html/TagNames/Pentax.html
@@ -401,10 +401,10 @@ different from other models)</span>
<br>14 = 640
<br>15 = 800
<br>16 = 1000
- <br>17 = 1250</td><td>&nbsp;&nbsp;</td>
- <td>18 = 1600
- <br>19 = 2000
- <br>20 = 2500
+ <br>17 = 1250
+ <br>18 = 1600
+ <br>19 = 2000</td><td>&nbsp;&nbsp;</td>
+ <td>20 = 2500
<br>21 = 3200
<br>22 = 4000
<br>23 = 5000
@@ -416,8 +416,14 @@ different from other models)</span>
<br>29 = 20000
<br>30 = 25600
<br>31 = 32000
- <br>32 = 40000</td><td>&nbsp;&nbsp;</td>
- <td>33 = 51200
+ <br>32 = 40000
+ <br>33 = 51200
+ <br>34 = 64000
+ <br>35 = 80000
+ <br>36 = 102400</td><td>&nbsp;&nbsp;</td>
+ <td>37 = 128000
+ <br>38 = 160000
+ <br>39 = 204800
<br>50 = 50
<br>100 = 100
<br>200 = 200
@@ -4576,7 +4582,7 @@ stored as ASCII text in a format very similar to some HP models.</p>
<hr>
(This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Sep 3, 2014</i>
+<br><i>Last revised Sep 22, 2014</i>
<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
</body>
</html>
diff --git a/html/TagNames/Sony.html b/html/TagNames/Sony.html
index dcfcbb26..a97900f0 100644
--- a/html/TagNames/Sony.html
+++ b/html/TagNames/Sony.html
@@ -536,7 +536,8 @@ Spot)</span></span></td></tr>
<br>317 = DSC-RX100M3
<br>318 = ILCE-7S
<br>319 = ILCA-77M2
- <br>339 = ILCE-5100</td><td>&nbsp;&nbsp;</td></tr></table>
+ <br>339 = ILCE-5100
+ <br>346 = ILCE-QX1</td><td>&nbsp;&nbsp;</td></tr></table>
</td></tr>
<tr class=b>
<td title='0xb020 = 45088'>0xb020</td>
@@ -7198,7 +7199,7 @@ the JPEG image from a PMP file)</span></span></td></tr>
<hr>
(This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Sep 19, 2014</i>
+<br><i>Last revised Sep 25, 2014</i>
<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
</body>
</html>
diff --git a/html/exiftool_pod.html b/html/exiftool_pod.html
index 7cf1518a..c4ab1cad 100644
--- a/html/exiftool_pod.html
+++ b/html/exiftool_pod.html
@@ -854,7 +854,7 @@ are ignored. For example, this format file:</p>
exiftool -p test.fmt a.jpg b.jpg</pre>
<p>produces output like this:</p>
<pre>
- -- Generated by ExifTool 9.71 --
+ -- Generated by ExifTool 9.72 --
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
diff --git a/html/history.html b/html/history.html
index cd030e63..b8c7aa27 100644
--- a/html/history.html
+++ b/html/history.html
@@ -17,6 +17,17 @@ considered development releases, and are not uploaded to <a href="http://search.
<!-- Use line width of 80 -->
<!-- *********************************************************************** -->
+<a name='v9.72'><b>Sept. 26, 2014 - Version 9.72</b></a>
+<ul>
+<li>Added a few new Pentax ISO values
+<li>Added a new CanonModelID and SonyModelID (thanks LibRaw)
+<li>Added a new Canon LensType
+<li>Decode AF points for some newer Nikon 1 cameras (thanks Chris Reimold for
+ his help, and Graham Woolf for the samples)
+<li>Improved verbose output for recently decoded Samsung trailer
+<li>Fixed Samsung trailer writer to properly update offsets in the QDIO block
+</ul>
+
<a name='v9.71'><b>Sept. 20, 2014 - Version 9.71</b></a>
<ul>
<li>Added a couple of mew CanonModelID's (thanks LibRaw)
diff --git a/html/index.html b/html/index.html
index 7cba5ca6..5d54edb8 100644
--- a/html/index.html
+++ b/html/index.html
@@ -74,9 +74,9 @@ span.sup { font-size: 0.8em; font-weight: normal; position: relative; top
</div>
<blockquote><table class='dl lg'><tr><td><b>
-<a href="http://sourceforge.net/projects/exiftool/files/Image-ExifTool-9.71.tar.gz/download">
-Download Version 9.71</a> (3.7 MB) -
-<a href="history.html">Sept 20, 2014</a></b></td></tr></table></blockquote>
+<a href="http://sourceforge.net/projects/exiftool/files/Image-ExifTool-9.72.tar.gz/download">
+Download Version 9.72</a> (3.7 MB) -
+<a href="history.html">Sept 26, 2014</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
@@ -125,8 +125,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-9.71.zip/download">
- exiftool-9.71.zip</a> (3.7 MB)</b></td></tr></table></blockquote>
+<a href="http://sourceforge.net/projects/exiftool/files/exiftool-9.72.zip/download">
+ exiftool-9.72.zip</a> (3.7 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
@@ -138,7 +138,7 @@ of Windows (including Windows 7).</p>
<blockquote><table class='dl lg'><tr><td><b>
Mac OS X Package:
<a href="http://sourceforge.net/projects/exiftool/files/ExifTool-9.70.dmg/download">
- ExifTool-9.71.dmg</a> (2.4 MB)</b></td></tr></table></blockquote>
+ ExifTool-9.72.dmg</a> (2.4 MB)</b></td></tr></table></blockquote>
<p><b>The OS X package</b> installs the ExifTool command-line application and
libraries in /usr/bin. After installing, type "<code>exiftool</code>" in a
diff --git a/html/struct.html b/html/struct.html
index fbcda0d5..4f83d5ba 100644
--- a/html/struct.html
+++ b/html/struct.html
@@ -212,13 +212,21 @@ structures which have the Keyword "<code>Terrier</code>" at the second level:</p
</td></tr></table></blockquote>
<p>Structure <b>fields may also be deleted individually</b> using the flattened
-tag names. The following command deletes only the matching fields from the
+tag names. The following command deletes only the matching fields from the
second-level of all HierarchicalKeywords structures:</p>
<blockquote><table class='box'><tr><td>
<pre class=code>exiftool -hierarchicalkeywords2-="Terrier" a.jpg</pre>
</td></tr></table></blockquote>
+<p>Individual structure <b>fields may NOT be deleted by writing a structure</b>
+with an empty field. Instead, a command like this overwrites the entire
+structure with a new structure containing an empty field:</p>
+
+<blockquote><table class='box'><tr><td>
+<pre><span class=code>exiftool -CreatorContactInfo="{CiAdrCity=}" a.jpg</span> # WRONG!</pre>
+</td></tr></table></blockquote>
+
<p>When deleting and adding back items in lists in the same command, new items
are inserted at the point in the list where the first item was removed, or at
the end of the list if no items were deleted. This applies to lists of
@@ -352,11 +360,11 @@ ArtworkTitle: a title
&gt; <span class=code>exiftool -xmp-iptcext:all -S -struct a.xmp</span>
ArtworkOrObject: [{AOTitle=a title}]
-<span class=lt># 2. Write another element to the structure as a flattened tag</span>
+<span class=lt># 2. Write another field to the structure as a flattened tag</span>
&gt; <span class=code>exiftool -artworkcreator=phil a.xmp</span>
1 image files updated
-<span class=lt># -- Note that the structure now has a new element</span>
+<span class=lt># -- Note that the structure now has a new field</span>
&gt; <span class=code>exiftool -xmp-iptcext:all -S -struct a.xmp</span>
ArtworkOrObject: [{AOCreator=[phil],AOTitle=a title}]
@@ -381,18 +389,18 @@ ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=a title},{AOTitle=another one}]
&gt; <span class=code>exiftool -artworktitle="different" a.xmp</span>
1 image files updated
-<span class=lt># -- This deleted all existing AOTitle elements and wrote back only one
+<span class=lt># -- This deleted all existing AOTitle fields and wrote back only one
# (if the second ArtworkOrObject structure had contained more fields, they would have been
-# preserved, and the second structure would still exist, but without an AOTitle element)</span>
+# preserved, and the second structure would still exist, but without an AOTitle field)</span>
&gt; <span class=code>exiftool -xmp-iptcext:all -S -struct a.xmp</span>
ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=different}]
<span class=lt># 6. Add a completely new structure to the list
-(this is very difficult to do properly using flattened tags)</span>
+# (this is very difficult to do properly using flattened tags)</span>
&gt; <span class=code>exiftool -artworkorobject+="{aotitle=help,aocreator=[paul,ringo]}" a.xmp</span>
1 image files updated
-<span class=lt># -- The new structure was added with the specified elements</span>
+<span class=lt># -- The new structure was added with the specified fields</span>
&gt; <span class=code>exiftool -xmp-iptcext:all -S -struct a.xmp</span>
ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=different},{AOCreator=[paul,ringo],AOTitle=help}]
@@ -401,7 +409,7 @@ ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=different},{AOCreator=[paul,ring
ArtworkCreator: phil, joe, paul, ringo
ArtworkTitle: different, help
-<span class=lt># 7. Delete all structures containing a specific element</span>
+<span class=lt># 7. Delete all structures containing a specific field value</span>
&gt; <span class=code>exiftool -artworkorobject-="{AOCreator=phil}" a.xmp</span>
1 image files updated
@@ -417,7 +425,7 @@ See the NewXMPxxxStruct tag definition in the <a href="config.html#xmp-xxx">XMP-
examples of the sample config file</a> for more details.</p>
<hr>
-<i>Last revised Sept. 6, 2014</i>
+<i>Last revised Sept. 20, 2014</i>
<p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
</body>
</html>
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm
index 6ec49d1f..8090ad1c 100644
--- a/lib/Image/ExifTool.pm
+++ b/lib/Image/ExifTool.pm
@@ -27,7 +27,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
%jpegMarker %specialTags);
-$VERSION = '9.71';
+$VERSION = '9.72';
$RELEASE = '';
@ISA = qw(Exporter);
%EXPORT_TAGS = (
@@ -4623,10 +4623,14 @@ sub ProcessTrailers($$)
$$fixup{Start} += length($outBuff) if $fixup;
$outBuff = ''; # free memory
}
- if ($fixup) {
- # add new fixup information if any
- $fixup->AddFixup($$dirInfo{Fixup}) if $$dirInfo{Fixup};
- } else {
+ if ($$dirInfo{Fixup}) {
+ if ($fixup) {
+ # add fixup for subsequent trailers to the fixup for this trailer
+ # (but first we must adjust for the new start position)
+ $$fixup{Shift} += $$dirInfo{Fixup}{Start};
+ $$fixup{Start} -= $$dirInfo{Fixup}{Start};
+ $$dirInfo{Fixup}->AddFixup($fixup);
+ }
$fixup = $$dirInfo{Fixup}; # save fixup
}
} else {
diff --git a/lib/Image/ExifTool/Canon.pm b/lib/Image/ExifTool/Canon.pm
index f2d15478..b844c6e4 100644
--- a/lib/Image/ExifTool/Canon.pm
+++ b/lib/Image/ExifTool/Canon.pm
@@ -82,7 +82,7 @@ sub ProcessSerialData($$$);
sub ProcessFilters($$$);
sub SwapWords($);
-$VERSION = '3.36';
+$VERSION = '3.37';
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -284,7 +284,8 @@ $VERSION = '3.36';
169.7 => 'Sigma 35mm f/1.4 DG HSM', #PH (also "| A" version, ref forum3833)
170 => 'Canon EF 200mm f/2.8L II', #9
171 => 'Canon EF 300mm f/4L', #15
- 172 => 'Canon EF 400mm f/5.6L', #32
+ 172 => 'Canon EF 400mm f/5.6L or Sigma Lens', #32
+ 172.1 =>'Sigma 150-600mm f/5-6.3 DG OS HSM | S', #forum3833
173 => 'Canon EF 180mm Macro f/3.5L or Sigma Lens', #9
173.1 => 'Sigma 180mm EX HSM Macro f/3.5', #14
173.2 => 'Sigma APO Macro 150mm f/2.8 EX DG HSM', #14
@@ -595,6 +596,7 @@ $VERSION = '3.36';
0x3690000 => 'PowerShot ELPH 135 / IXUS 145 / IXY 120',
0x3700000 => 'PowerShot ELPH 340 HS / IXUS 265 HS / IXY 630',
0x3710000 => 'PowerShot ELPH 150 IS / IXUS 155 / IXY 140',
+ 0x3760000 => 'PowerShot SX520 HS', #52
0x3780000 => 'PowerShot G7 X', #52
0x4040000 => 'PowerShot G1',
0x6040000 => 'PowerShot S100 / Digital IXUS / IXY Digital',
diff --git a/lib/Image/ExifTool/Nikon.pm b/lib/Image/ExifTool/Nikon.pm
index 231fffcf..60ea9854 100644
--- a/lib/Image/ExifTool/Nikon.pm
+++ b/lib/Image/ExifTool/Nikon.pm
@@ -56,15 +56,18 @@ use vars qw($VERSION %nikonLensIDs %nikonTextEncoding);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '2.93';
+$VERSION = '2.94';
sub LensIDConv($$$);
sub ProcessNikonAVI($$$);
sub ProcessNikonMOV($$$);
sub FormatString($);
sub ProcessNikonCaptureEditVersions($$$);
-sub PrintAFPoints($$;$);
-sub PrintAFPointsInv($$;$);
+sub PrintAFPoints($$);
+sub PrintAFPointsInv($$$);
+sub PrintAFPointsGrid($$);
+sub PrintAFPointsGridInv($$$);
+sub GetAFPointGrid($$;$);
# nikon lens ID numbers (ref 8/11)
%nikonLensIDs = (
@@ -2518,6 +2521,7 @@ my %binaryDataAttrs = (
2 => 'Contrast-detect (wide area)', # (D90/D5000)
3 => 'Contrast-detect (face priority)', # (ViewNX)
4 => 'Contrast-detect (subject tracking)', # (ViewNX)
+ 128 => 'Single (171 points)', #PH (1V3)
},
},
],
@@ -2530,8 +2534,9 @@ my %binaryDataAttrs = (
1 => 'On (51-point)', #PH
2 => 'On (11-point)', #PH
3 => 'On (39-point)', #29 (D7000)
- 4 => 'On (hybrid)', #PH (1J1)
- 5 => 'On (105-point)', #PH (1J4)
+ 4 => 'On (73-point)', #PH (1J1,1J2,1J3,1S1,1V1,1V2)
+ 5 => 'On (73-point, new)', #PH (1S2)
+ 6 => 'On (105-point)', #PH (1J4,1V3)
},
},
7 => [
@@ -2580,7 +2585,7 @@ my %binaryDataAttrs = (
{ #PH
Name => 'PrimaryAFPoint',
Condition => '$$self{PhaseDetectAF} == 4',
- Notes => 'models with 135-point AF: Nikon 1 models',
+ Notes => 'Nikon 1 models with older 135-point AF and 73-point phase-detect AF',
PrintConvColumns => 5,
PrintConv => {
0 => '(none)',
@@ -2588,6 +2593,44 @@ my %binaryDataAttrs = (
1 => 'E8 (Center)', # (add " (Center)" to central point)
},
},
+ { #PH (NC)
+ Name => 'PrimaryAFPoint',
+ Condition => '$$self{PhaseDetectAF} == 5',
+ Notes => q{
+ Nikon 1 models with newer 135-point AF and 73-point phase-detect AF -- 9
+ rows (B-J) and 15 columns (1-15), inside a grid of 11 rows by 15 columns.
+ The points are numbered sequentially, with F8 at the center
+ },
+ PrintConv => {
+ 0 => '(none)',
+ 82 => 'F8 (Center)',
+ OTHER => sub {
+ my ($val, $inv) = @_;
+ return GetAFPointGrid($val, 15, $inv);
+ },
+ },
+ },
+ { #PH
+ Name => 'PrimaryAFPoint',
+ Condition => '$$self{PhaseDetectAF} == 6',
+ Notes => q{
+ Nikon 1 models with 171-point AF and 105-point phase-detect AF -- 9 rows
+ (B-J) and 19 columns (2-20), inside a grid of 11 rows by 21 columns. The
+ points are numbered sequentially, with F11 at the center
+ },
+ PrintConv => {
+ 0 => '(none)',
+ #22 => 'B2 (Top-left)',
+ #40 => 'B20 (Top-right)',
+ 115 => 'F11 (Center)',
+ #190 => 'J2 (Bottom-left)',
+ #208 => 'J20 (Bottom-right)',
+ OTHER => sub {
+ my ($val, $inv) = @_;
+ return GetAFPointGrid($val, 21, $inv);
+ },
+ },
+ },
{
Name => 'PrimaryAFPoint',
Notes => 'future models?...',
@@ -2606,8 +2649,10 @@ my %binaryDataAttrs = (
point is C6
},
Format => 'undef[7]',
+ ValueConv => 'join(" ", unpack("H2"x7, $val))',
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
PrintConv => sub { PrintAFPoints(shift, \%afPoints51); },
- PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints51); },
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints51, 7); },
},
{ #10
Name => 'AFPointsUsed',
@@ -2644,26 +2689,58 @@ my %binaryDataAttrs = (
point is C6
},
Format => 'undef[7]',
+ ValueConv => 'join(" ", unpack("H2"x7, $val))',
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
PrintConv => sub { PrintAFPoints(shift, \%afPoints39); },
- PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints39); },
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints39, 7); },
},
- { #PH (1J1, AFInfo2Version = "0200")
+ { #PH (1AW1,1J1,1J2,1J3,1S1,1V1,1V2)
Name => 'AFPointsUsed',
Condition => '$$self{PhaseDetectAF} == 4',
Notes => q{
- models with 135-point AF -- 9 rows (A-I) and 15 columns (1-15). Center
- point is E8. The odd-numbered columns, columns 2 and 14, and the remaining
- corner points are not used for 41-point AF mode
+ older models with 135-point AF -- 9 rows (A-I) and 15 columns (1-15).
+ Center point is E8. The odd-numbered columns, columns 2 and 14, and the
+ remaining corner points are not used for 41-point AF mode
},
Format => 'undef[17]',
- PrintConv => sub { PrintAFPoints(shift, \%afPoints135, 17); },
+ ValueConv => 'join(" ", unpack("H2"x17, $val))',
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints135); },
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints135, 17); },
},
+ { #PH (1S2)
+ Name => 'AFPointsUsed',
+ Condition => '$$self{PhaseDetectAF} == 5',
+ Notes => q{
+ newer models with 135-point AF -- 9 rows (B-J) and 15 colums (1-15). Center
+ point is F8
+ },
+ Format => 'undef[21]',
+ ValueConv => 'join(" ", unpack("H2"x21, $val))',
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
+ PrintConv => sub { PrintAFPointsGrid(shift, 15); },
+ PrintConvInv => sub { PrintAFPointsGridInv(shift, 15, 21); },
+ },
+ { #PH (1J4,1V3)
+ Name => 'AFPointsUsed',
+ Condition => '$$self{PhaseDetectAF} == 6',
+ Notes => q{
+ models with 171-point AF -- 9 rows (B-J) and 19 columns (2-20). Center
+ point is F10
+ },
+ Format => 'undef[29]',
+ ValueConv => 'join(" ", unpack("H2"x29, $val))',
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
+ PrintConv => sub { PrintAFPointsGrid(shift, 21); },
+ PrintConvInv => sub { PrintAFPointsGridInv(shift, 21, 29); },
+ },
{
Name => 'AFPointsUsed',
Format => 'undef[7]',
- PrintConv => '$_=unpack("H*",$val); "Unknown (".join(" ", /(..)/g).")"',
- PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/;$val=~tr/ //d;pack("H*",$val)',
+ ValueConv => 'join(" ", unpack("H2"x7, $val))',
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
+ PrintConv => '"Unknown ($val)"',
+ PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val',
},
],
0x10 => { #PH (D90 and D5000)
@@ -5654,22 +5731,22 @@ sub ProcessNikonAVI($$$)
#------------------------------------------------------------------------------
# Print conversion for Nikon AF points
-# Inputs: 0) value to convert (undef[7]),
+# Inputs: 0) value to convert (as a string of hex bytes),
# 1) lookup for AF point bit number (starting at 1)
-# 2) size of data
-sub PrintAFPoints($$;$)
+sub PrintAFPoints($$)
{
- my ($val, $afPoints, $size) = @_;
- $size or $size = 7;
- return 'Unknown' unless length $val == $size;
- my ($i, @points);
- my @dat = unpack('C*', $val);
- my $num = scalar(keys %$afPoints);
- my ($byte, $mask) = (0, 0x01);
- # loop through all AF points to find active ones
- for ($i=1; $i<=$num; ++$i) {
- push @points, $$afPoints{$i} if $dat[$byte] & $mask;
- ($mask <<= 1) > 0x80 and $mask = 0x01, ++$byte;
+ my ($val, $afPoints) = @_;
+ my ($i, $j, @points);
+ $val =~ tr/ //d; # remove spaces from hex string
+ my @dat = unpack 'C*', pack 'H*', $val; # convert to array of bytes
+ # loop through all bytes to find active AF points
+ for ($i=0; $i<=@dat; ++$i) {
+ next unless $dat[$i];
+ for ($j=0; $j<8; ++$j) {
+ next unless $dat[$i] & (1 << $j);
+ my $point = $$afPoints{$i*8 + $j + 1};
+ push @points, $point if defined $point;
+ }
}
return '(none)' unless @points;
# sort the points and return as comma-separated string
@@ -5683,11 +5760,10 @@ sub PrintAFPoints($$;$)
#------------------------------------------------------------------------------
# Inverse print conversion for AF points
# Inputs: 0) AF point string, 1) AF point lookup, 2) size of data
-# Returns: undef[7] AF point data
-sub PrintAFPointsInv($$;$)
+# Returns: AF point data as a string of hex bytes
+sub PrintAFPointsInv($$$)
{
my ($val, $afPoints, $size) = @_;
- $size or $size = 7;
my @points = ($val =~ /[A-Za-z]\d+/g);
my @dat = (0) x $size;
if (@points) {
@@ -5699,7 +5775,66 @@ sub PrintAFPointsInv($$;$)
$dat[$byte] |= (1 << (($bitNum - 1) % 8));
}
}
- return pack('C*', @dat);
+ return join(" ", unpack("H2"x$size, pack('C*', @dat)));
+}
+
+#------------------------------------------------------------------------------
+# Get AF point name for grid-type AF
+# Inputs: 0) AF point number, 1) number of columns, 2) true for inverse conversion
+# Returns: AF point name, or undef
+sub GetAFPointGrid($$;$)
+{
+ my ($val, $ncol, $inv) = @_;
+ if ($inv) {
+ return undef unless $val =~ /^([A-J])(\d+)$/i;
+ return (ord(uc($1))-65) * $ncol + $2 - 1;
+ } else {
+ my $row = int(($val - 0.5) / $ncol);
+ my $col = $val - $ncol * $row + 1;
+ return chr(65+$row) . $col;
+ }
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for grid-type AF points
+# Inputs: 0) value to convert (as a string of hex bytes),
+# 1) number of columns in grid
+sub PrintAFPointsGrid($$)
+{
+ my ($val, $ncol) = @_;
+ my ($i, $j, @points);
+ $val =~ tr/ //d; # remove spaces from hex string
+ my @dat = unpack 'C*', pack 'H*', $val; # convert to array of bytes
+ # loop through all bytes to find active AF points
+ for ($i=0; $i<@dat; ++$i) {
+ next unless $dat[$i];
+ for ($j=0; $j<8; ++$j) {
+ next unless $dat[$i] & (1 << $j);
+ my $point = GetAFPointGrid($i*8 + $j, $ncol);
+ push @points, $point if defined $point;
+ }
+ }
+ return '(none)' unless @points;
+ return join ',', @points; # return as comma-separated string
+}
+
+#------------------------------------------------------------------------------
+# Inverse print conversion for AF points
+# Inputs: 0) AF point string, 1) number of columns, 2) size of data
+# Returns: AF point data as a string of hex bytes
+sub PrintAFPointsGridInv($$$)
+{
+ my ($val, $ncol, $size) = @_;
+ my @points = ($val =~ /[A-Za-z]\d+/g);
+ my @dat = (0) x $size;
+ foreach (@points) {
+ my $n = GetAFPointGrid($_, $ncol, 1);
+ next unless defined $n;
+ my $byte = int($n / 8);
+ next if $byte > $size;
+ $dat[$byte] |= (1 << ($n - $byte * 8));
+ }
+ return join(" ", unpack("H2"x$size, pack('C*', @dat)));
}
#------------------------------------------------------------------------------
diff --git a/lib/Image/ExifTool/Pentax.pm b/lib/Image/ExifTool/Pentax.pm
index 08ad424c..8783ad99 100644
--- a/lib/Image/ExifTool/Pentax.pm
+++ b/lib/Image/ExifTool/Pentax.pm
@@ -55,7 +55,7 @@ use vars qw($VERSION %pentaxLensTypes);
use Image::ExifTool::Exif;
use Image::ExifTool::HP;
-$VERSION = '2.80';
+$VERSION = '2.81';
sub CryptShutterCount($$);
sub PrintFilter($$$);
@@ -1302,6 +1302,12 @@ my %binaryDataAttrs = (
31 => 32000, #PH
32 => 40000, #PH
33 => 51200, #PH
+ 34 => 64000, #PH (NC)
+ 35 => 80000, #PH (NC)
+ 36 => 102400, #forum3833
+ 37 => 128000, #PH (NC)
+ 38 => 160000, #PH (NC)
+ 39 => 204800, #forum3833
# Optio 330/430 (oddball)
50 => 50, #PH
100 => 100, #PH
diff --git a/lib/Image/ExifTool/Samsung.pm b/lib/Image/ExifTool/Samsung.pm
index 7a8890cc..e20b9050 100644
--- a/lib/Image/ExifTool/Samsung.pm
+++ b/lib/Image/ExifTool/Samsung.pm
@@ -19,7 +19,7 @@ use vars qw($VERSION %samsungLensTypes);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.25';
+$VERSION = '1.26';
sub WriteSTMN($$$);
sub ProcessINFO($$$);
@@ -825,7 +825,7 @@ sub ProcessSamsung($$$)
my $outfile = $$dirInfo{OutFile};
my $verbose = $et->Options('Verbose');
my $unknown = $et->Options('Unknown');
- my ($buff, $buf2, $index, $t);
+ my ($buff, $buf2, $index, $offsetPos, $audioNOff, $audioSize);
return 0 unless $raf->Seek(-6-$offset, 2) and $raf->Read($buff, 6) == 6 and
($buff eq 'QDIOBS' or $buff eq "\0\0SEFT");
@@ -834,7 +834,8 @@ sub ProcessSamsung($$$)
my $blockEnd = $raf->Tell();
SetByteOrder('II');
- # read blocks backward until we find the SEFH/SEFT block (only seen QDIO/QDIO)
+ # read blocks backward until we find the SEFH/SEFT block
+ # (the only other block I have seen is QDIO/QDIO)
SamBlock:
for (;;) {
last unless $raf->Seek($blockEnd-8, 0) and $raf->Read($buff, 8) == 8;
@@ -844,25 +845,64 @@ SamBlock:
last unless $len < 0x10000 and $len >= 4 and $len + 8 < $blockEnd;
last unless $raf->Seek(-8-$len, 1) and $raf->Read($buff, $len) == $len;
$blockEnd -= $len + 8;
- next unless $type eq 'SEFT'; # look for directory block (ends with "SEFT")
+ unless ($type eq 'SEFT') { # look for directory block (ends with "SEFT")
+ next unless $outfile and $type eq 'QDIO';
+ # QDIO block format:
+ # 0 - 'QDIO'
+ # 4 - int32u: 101 (version)
+ # 8 - int32u: 1
+ # 12 - int32u: absolute offset of audio file start (augh!!)
+ # 16 - int32u: absolute offset of audio file end (augh!!)
+ # 20 - int32u: 20 (QDIO block length minus 8)
+ # 24 - 'QDIO'
+ if ($len == 20) {
+ # save position of audio file offset in QDIO block
+ $offsetPos = $endPos - $raf->Tell() + $len - 12;
+ } else {
+ $et->Error('Unsupported Samsung trailer QDIO block', 1);
+ }
+ next;
+ }
last unless $buff =~ /^SEFH/ and $len >= 12; # validate SEFH header
my $dirPos = $raf->Tell() - $len;
# my $ver = Get32u(\$buff, 0x04); # version (=101)
my $count = Get32u(\$buff, 0x08);
last if 12 + 12 * $count > $len;
- $et->VPrint(1, "Samsung Trailer:\n") if $verbose > 1 and not $outfile;
my $tagTablePtr = GetTagTable('Image::ExifTool::Samsung::Trailer');
- # parse the SEFH/SEFT directory block
+ # scan ahead quickly to look for the block where the data comes first
+ # (have only seen this to be the first in the directory, but just in case)
my $firstBlock = 0;
for ($index=0; $index<$count; ++$index) {
my $entry = 12 + 12 * $index;
+ my $noff = Get32u(\$buff, $entry + 4); # negative offset
+ $firstBlock = $noff if $firstBlock < $noff;
+ }
+ # save trailer position and length
+ my $dataPos = $$dirInfo{DataPos} = $dirPos - $firstBlock;
+ my $dirLen = $$dirInfo{DirLen} = $endPos - $dataPos;
+ if (($verbose or $$et{HTML_DUMP}) and not $outfile) {
+ $et->DumpTrailer($dirInfo);
+ return 1 if $$et{HTML_DUMP};
+ }
+ # read through the SEFH/SEFT directory entries
+ for ($index=0; $index<$count; ++$index) {
+ my $entry = 12 + 12 * $index;
+ # first 2 bytes always 0 (may be part of block type)
my $type = Get16u(\$buff, $entry + 2); # block type
my $noff = Get32u(\$buff, $entry + 4); # negative offset
my $size = Get32u(\$buff, $entry + 8); # block size
last SamBlock if $noff > $dirPos or $size > $noff or $size < 8;
$firstBlock = $noff if $firstBlock < $noff;
- next if $outfile;
+ if ($outfile) {
+ next unless $type == 0x0100 and not $audioNOff;
+ # save offset and length of first audio file for QDIO block
+ last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, 8) == 8;
+ $len = Get32u(\$buf2, 4);
+ $audioNOff = $noff - 8 - $len; # negative offset to start of audio data
+ $audioSize = $size - 8 - $len;
+ next;
+ }
# add unknown tags if necessary
my $tag = sprintf("0x%.4x", $type);
unless ($$tagTablePtr{$tag}) {
@@ -882,6 +922,8 @@ SamBlock:
AddTagToTable($tagTablePtr, "$tag-name", \%tagInfo2);
}
last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, $size) == $size;
+ # (could validate the first 4 bytes of the block because they
+ # are the same as the first 4 bytes of the directory entry)
$len = Get32u(\$buf2, 4);
last if $len + 8 > $size;
# extract tag name and value
@@ -898,15 +940,24 @@ SamBlock:
Size => $size - (8 + $len),
);
}
- # save trailer position and length
- my $dataPos = $$dirInfo{DataPos} = $dirPos - $firstBlock;
- my $dirLen = $$dirInfo{DirLen} = $endPos - $dataPos;
if ($outfile) {
last unless $raf->Seek($dataPos, 0) and $raf->Read($buff, $dirLen) == $dirLen;
+ # adjust the absolute offset in the QDIO block if necessary
+ if ($offsetPos and $audioNOff) {
+ # initialize the audio file start/end position in the QDIO block
+ my $newPos = Tell($outfile) + $dirPos - $audioNOff - $dataPos;
+ Set32u($newPos, \$buff, length($buff) - $offsetPos);
+ Set32u($newPos + $audioSize, \$buff, length($buff) - $offsetPos + 4);
+ # 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->AddFixup(length($buff) - $offsetPos);
+ $fixup->AddFixup(length($buff) - $offsetPos + 4);
+ }
$et->VPrint(0, "Writing Samsung trailer ($dirLen bytes)\n") if $verbose;
Write($$dirInfo{OutFile}, $buff) or return -1;
- } elsif ($$et{HTML_DUMP}) {
- $et->DumpTrailer($dirInfo) if $$dirInfo{RAF};
+ return 1;
}
return 1;
}
diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm
index ab27d242..3b4305d1 100644
--- a/lib/Image/ExifTool/Sony.pm
+++ b/lib/Image/ExifTool/Sony.pm
@@ -1239,6 +1239,7 @@ my %meterInfo2 = (
318 => 'ILCE-7S', #12
319 => 'ILCA-77M2', #14
339 => 'ILCE-5100', #12
+ 346 => 'ILCE-QX1', #14
},
},
0xb020 => { #2
diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod
index 16f96116..7389c8ff 100644
--- a/lib/Image/ExifTool/TagNames.pod
+++ b/lib/Image/ExifTool/TagNames.pod
@@ -8859,6 +8859,8 @@ These tags are written by Nikon DSLR's which have the live view feature.
AFPointsUsed undef[2]
AFPointsUsed undef[7]
AFPointsUsed undef[17]
+ AFPointsUsed undef[21]
+ AFPointsUsed undef[29]
AFPointsUsed undef[7]
16 AFImageWidth int16u
18 AFImageHeight int16u
diff --git a/perl-Image-ExifTool.spec b/perl-Image-ExifTool.spec
index d261fb6d..b469982e 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: 9.71
+Version: 9.72
Release: 1
License: Artistic/GPL
Group: Development/Libraries/Perl
diff --git a/t/images/ExifTool.jpg b/t/images/ExifTool.jpg
index 8b25dfb3..b9ae1e42 100644
--- a/t/images/ExifTool.jpg
+++ b/t/images/ExifTool.jpg
Binary files differ