diff --git a/src/pentaxmn.cpp b/src/pentaxmn.cpp index a4924713..96fd6b93 100644 --- a/src/pentaxmn.cpp +++ b/src/pentaxmn.cpp @@ -1148,26 +1148,39 @@ namespace Exiv2 { // ---------------------------------------------------------------------- // #816 begin - std::ostream& resolveLensType(std::ostream& os, const Value& value, + std::ostream& resolveLensTypeSigma(std::ostream& os, const Value& value, const ExifData* metadata) { try { unsigned long lensID = value.toLong(0)*256 + value.toLong(1); unsigned long index = 0; - if ( lensID == 0x3ff ) { // lensType Sigma + if ( value.count() == 2 ) { + // http://dev.exiv2.org/attachments/download/326/IMGP4432.PEF + // exiv2 -pv --grep Lens ~/Downloads/IMGP4432.PEF + // 0x003f Pentax LensType Byte 2 3 255 + // 0x0207 Pentax LensInfo Undefined 36 3 255 0 0 40 148 71 152 80 6 241 65 237 153 88 36 1 76 107 251 255 255 255 0 0 80 6 241 0 0 0 0 0 0 0 0 unsigned long base = 1; // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html#LensData const ExifData::const_iterator lensInfo = metadata->findKey(ExifKey("Exif.Pentax.LensInfo")); - if ( lensID == 0x3ff && lensInfo->count() > 5 ) { + if ( lensInfo->count() > 5 ) { unsigned int autoAperture = lensInfo->toLong(base+1) & 0x01 ; unsigned int minAperture = lensInfo->toLong(base+2) & 0x06 ; unsigned int minFocusDistance = lensInfo->toLong(base+3) & 0xf8 ; + unsigned int dontKnow = lensInfo->toLong(base+4); - // os << "autoAperture = " << autoAperture << " minAperture = " << minAperture << " minFocusDistance = " << minFocusDistance << " " ; - - if ( autoAperture == 0x0 && minAperture == 0x0 && minFocusDistance == 0x28 ) index = 8; + if ( autoAperture == 0x0 && minAperture == 0x0 && minFocusDistance == 0x28 && dontKnow == 148) index = 8; + } + } else if ( value.count() == 3 ) { + // http://dev.exiv2.org/attachments/download/858/_IGP9032.DNG + // $ exiv2 -pv --grep Lens ~/Downloads/_IGP9032.DNG + // 0x003f PentaxDng LensType Byte 3 3 255 0 + // 0x0207 PentaxDng LensInfo Undefined 69 131 0 0 255 0 40 148 68 244 ... + // 0 1 2 3 4 5 6 + const ExifData::const_iterator lensInfo = metadata->findKey(ExifKey("Exif.PentaxDng.LensInfo")); + if ( lensInfo->count() > 5 ) { + if ( lensInfo->toLong(4) == 0 && lensInfo->toLong(5) == 40 && lensInfo->toLong(6) == 148 ) index = 8; } } @@ -1180,6 +1193,12 @@ namespace Exiv2 { return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata); } + std::ostream& resolveLensType(std::ostream& os, const Value& value, + const ExifData* metadata) + { + return EXV_PRINT_COMBITAG_MULTI(pentaxLensType, 2, 1, 2)(os, value, metadata); + } + struct LensIdFct { long id_; //!< Lens id PrintFct fct_; //!< Pretty-print function @@ -1199,7 +1218,7 @@ namespace Exiv2 { { 0x032c, resolveLensType }, { 0x032e, resolveLensType }, { 0x0334, resolveLensType }, - { 0x03ff, resolveLensType }, + { 0x03ff, resolveLensTypeSigma }, { 0x041a, resolveLensType }, { 0x042d, resolveLensType }, { 0x08ff, resolveLensType }, diff --git a/test/bugfixes-test.sh b/test/bugfixes-test.sh index 7c6bff30..efc19634 100755 --- a/test/bugfixes-test.sh +++ b/test/bugfixes-test.sh @@ -219,6 +219,15 @@ source ./functions.source runTest exiv2 -u -v -M"set Exif.Photo.UserComment Test Bug $num modified" bug$num.jpg runTest exiv2 -PE -g UserComment bug${num}*.jpg + num=816 # test Camera: Pentax + Lens:Sigma 55-200mm F4-5.6 DC is correctly reported + printf "$num " >&3 + echo '------>' Bug $num '<-------' >&2 + for X in a b; do + file=exiv2-bug${num}${X}.exv + copyTestFile $file + runTest exiv2 -pa --grep Lens $file + done + num=831 filename=exiv2-bug$num.tif printf "$num " >&3 diff --git a/test/data/bugfixes-test.out b/test/data/bugfixes-test.out index 7880b1cd..66f45289 100644 Binary files a/test/data/bugfixes-test.out and b/test/data/bugfixes-test.out differ diff --git a/test/data/exiv2-bug816a.exv b/test/data/exiv2-bug816a.exv new file mode 100644 index 00000000..c76409d1 Binary files /dev/null and b/test/data/exiv2-bug816a.exv differ diff --git a/test/data/exiv2-bug816b.exv b/test/data/exiv2-bug816b.exv new file mode 100644 index 00000000..6e9adcff Binary files /dev/null and b/test/data/exiv2-bug816b.exv differ