From a803ce3bff1658c611748764404cbb4afa8d8e65 Mon Sep 17 00:00:00 2001 From: Robin Mills Date: Wed, 26 Jun 2019 20:36:59 +0100 Subject: [PATCH] Add support for FocusPosition in Sony RAW files (#906) * Fix 582 Add support for FocusPosition in Sony RAW files * Thanks to @boardhead sonyFpCrypt() works correctly. Removed debug code. Fixed typos. * Update doc/templates/Makefile to process Sony2Fp * Following review by @boardhead. Renamed sonyFpCrypt() as sonyTagDecipher(). * Fixed writing the tag thanks to @boardhead explaining encipher/decipher. Sadly, ArrayCfg/crpyt does not know if he's encrypting/decrypting. I've added a sniff in TiffEncoder::visitBinaryArrayEnd to avoid changing the API. * Added URL to discussion concerning sonyTagCipher() * make sonyTagCipher() a static function with no external visibility. (cherry picked from commit ab375fb07462e92d9f64d4d38c7f70278c747d16) --- doc/templates/Makefile | 5 +-- src/sonymn_int.cpp | 51 +++++++++++++++++++++++++++ src/sonymn_int.hpp | 7 ++++ src/tags_int.cpp | 3 +- src/tags_int.hpp | 1 + src/tiffimage_int.cpp | 24 +++++++++++++ src/tiffvisitor_int.cpp | 6 +++- test/data/exiv2-pr906.exv | Bin 0 -> 49473 bytes tests/bugfixes/github/test_pr_906.py | 17 +++++++++ 9 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 test/data/exiv2-pr906.exv create mode 100644 tests/bugfixes/github/test_pr_906.py diff --git a/doc/templates/Makefile b/doc/templates/Makefile index 4e8614f47d..f33bed8892 100644 --- a/doc/templates/Makefile +++ b/doc/templates/Makefile @@ -98,7 +98,7 @@ TABLES = Exif \ OlympusFi \ OlympusFe1 \ OlympusRi \ - Panasonic \ + Panasonic \ PanasonicRaw \ Pentax \ Samsung2 \ @@ -110,7 +110,8 @@ TABLES = Exif \ Sony1Cs2 \ Sony1MltCs7D \ Sony1MltCsOld \ - Sony1MltCsA100 + Sony1MltCsA100 \ + Sony2Fp SCHEMA = xmp_dc \ xmp_dwc \ diff --git a/src/sonymn_int.cpp b/src/sonymn_int.cpp index f4bee162de..3546282e7a 100644 --- a/src/sonymn_int.cpp +++ b/src/sonymn_int.cpp @@ -28,6 +28,7 @@ #include "minoltamn_int.hpp" #include "sonymn_int.hpp" #include "tags_int.hpp" +#include "tiffcomposite_int.hpp" #include "value.hpp" #include "i18n.h" // NLS support. @@ -796,4 +797,54 @@ namespace Exiv2 { return tagInfoCs2_; } + //! Sony Tag 9402 Sony2Fp (FocusPosition) + const TagInfo SonyMakerNote::tagInfoFp_[] = { + TagInfo( 0x04, "AmbientTemperature", N_("Ambient Temperature"), N_("Ambient Temperature"), sony2FpId, makerTags, signedByte, 1, printValue), + TagInfo( 0x16, "FocusMode" , N_("Focus Mode") , N_("Focus Mode") , sony2FpId, makerTags, unsignedByte, 1, printValue), + TagInfo( 0x17, "AFAreaMode" , N_("AF Area Mode") , N_("AF Area Mode") , sony2FpId, makerTags, unsignedByte, 1, printValue), + TagInfo( 0x2d, "FocusPosition2" , N_("Focus Position 2") , N_("Focus Position 2") , sony2FpId, makerTags, unsignedByte, 1, printValue), + // End of list marker + TagInfo(0xffff, "(Unknownsony2FpTag)", "(Unknownsony2FpTag)" , "(Unknownsony2FpTag)" , sony2FpId, makerTags, unsignedByte, 1, printValue) + }; + + const TagInfo* SonyMakerNote::tagListFp() + { + return tagInfoFp_; + } + + // https://github.com/Exiv2/exiv2/pull/906#issuecomment-504338797 + static DataBuf sonyTagCipher(uint16_t /* tag */, const byte* bytes, uint32_t size, TiffComponent* const /*object*/, bool bDecipher) + { + DataBuf b(bytes,size); // copy the data + + // initialize the code table + byte code[256]; + for ( uint32_t i = 0 ; i < 249 ; i++ ) { + if ( bDecipher ) { + code[(i * i * i) % 249] = i ; + } else { + code[i] = (i * i * i) % 249 ; + } + } + for ( uint32_t i = 249 ; i < 256 ; i++ ) { + code[i] = i; + } + + // code byte-by-byte + for ( uint32_t i = 0 ; i < size ; i++ ) { + b.pData_[i] = code[bytes[i]]; + } + + return b; + } + + DataBuf sonyTagDecipher(uint16_t tag, const byte* bytes, uint32_t size, TiffComponent* const object) + { + return sonyTagCipher(tag,bytes,size,object,true); + } + DataBuf sonyTagEncipher(uint16_t tag, const byte* bytes, uint32_t size, TiffComponent* const object) + { + return sonyTagCipher(tag,bytes,size,object,false); + } + }} // namespace Internal, Exiv2 diff --git a/src/sonymn_int.hpp b/src/sonymn_int.hpp index 4af2d7130c..84c7a9a5e9 100644 --- a/src/sonymn_int.hpp +++ b/src/sonymn_int.hpp @@ -35,6 +35,7 @@ Email communication with ca // included header files #include "tags.hpp" #include "types.hpp" +#include "tiffcomposite_int.hpp" // + standard includes #include @@ -57,6 +58,8 @@ namespace Exiv2 { static const TagInfo* tagListCs(); //! Return read-only list of built-in Sony Standard Camera Settings version 2 tags static const TagInfo* tagListCs2(); + //! Return read-only list of built-in Sony FocusPosition tags + static const TagInfo* tagListFp(); //! @name Print functions for Sony %MakerNote tags //@{ @@ -70,7 +73,11 @@ namespace Exiv2 { static const TagInfo tagInfo_[]; static const TagInfo tagInfoCs_[]; static const TagInfo tagInfoCs2_[]; + static const TagInfo tagInfoFp_[]; }; // class SonyMakerNote + DataBuf sonyTagDecipher(uint16_t, const byte*, uint32_t, TiffComponent* const); + DataBuf sonyTagEncipher(uint16_t, const byte*, uint32_t, TiffComponent* const); + }} // namespace Internal, Exiv2 diff --git a/src/tags_int.cpp b/src/tags_int.cpp index 4f772539a5..15840ff376 100644 --- a/src/tags_int.cpp +++ b/src/tags_int.cpp @@ -162,9 +162,10 @@ namespace Exiv2 { { sony1MltCs7DId, "Makernote", "Sony1MltCs7D", MinoltaMakerNote::tagListCs7D }, { sony1MltCsOldId, "Makernote", "Sony1MltCsOld",MinoltaMakerNote::tagListCsStd }, { sony1MltCsNewId, "Makernote", "Sony1MltCsNew",MinoltaMakerNote::tagListCsStd }, - { sony1MltCsA100Id,"Makernote","Sony1MltCsA100",MinoltaMakerNote::tagListCsA100}, + { sony1MltCsA100Id,"Makernote", "Sony1MltCsA100",MinoltaMakerNote::tagListCsA100}, { sony2CsId, "Makernote", "Sony2Cs", SonyMakerNote::tagListCs }, { sony2Cs2Id, "Makernote", "Sony2Cs2", SonyMakerNote::tagListCs2 }, + { sony2FpId, "Makernote", "Sony2Fp", SonyMakerNote::tagListFp }, { lastId, "(Last IFD info)", "(Last IFD item)", 0 } }; diff --git a/src/tags_int.hpp b/src/tags_int.hpp index 9edc95fb84..2a79935b95 100644 --- a/src/tags_int.hpp +++ b/src/tags_int.hpp @@ -153,6 +153,7 @@ namespace Exiv2 { sony1Cs2Id, sony2CsId, sony2Cs2Id, + sony2FpId, sony1MltCs7DId, sony1MltCsOldId, sony1MltCsNewId, diff --git a/src/tiffimage_int.cpp b/src/tiffimage_int.cpp index 85f72e63fd..e24d8d26f5 100644 --- a/src/tiffimage_int.cpp +++ b/src/tiffimage_int.cpp @@ -2,6 +2,7 @@ #include "error.hpp" #include "makernote_int.hpp" +#include "sonymn_int.hpp" #include "tiffvisitor_int.hpp" #include "i18n.h" // NLS support. @@ -767,6 +768,24 @@ namespace Exiv2 { false, // Don't concatenate gaps { 0, ttUnsignedShort, 1 } }; + + extern const ArrayCfg sony2FpCfg = { + sony2FpId, // Group for the elements + bigEndian, // Big endian + ttUnsignedByte, // Type for array entry and size element + sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); + false, // No size element + false, // No fillers + false, // Don't concatenate gaps + { 0, ttUnsignedByte, 1 } + }; + extern const ArrayDef sony2FpDef[] = { + { 0x4, ttSignedByte , 1 }, // Exif.Sony2Fp.AmbientTemperature + { 0x16, ttUnsignedByte, 1 }, // Exif.Sony2Fp.FocusMode + { 0x17, ttUnsignedByte, 1 }, // Exif.Sony2Fp.AFAreaMode + { 0x2d, ttUnsignedByte, 1 } // Exif.Sony2Fp.FocusPosition2 + }; + //! Sony[12] Camera Settings binary array - definition extern const ArrayDef sonyCsDef[] = { { 12, ttSignedShort, 1 } // Exif.Sony[12]Cs.WhiteBalanceFineTune @@ -988,6 +1007,7 @@ namespace Exiv2 { { Tag::root, sony1MltCs7DId, sonyMltId, 0x0004 }, { Tag::root, sony1MltCsA100Id, sonyMltId, 0x0114 }, { Tag::root, sony2Id, exifId, 0x927c }, + { Tag::root, sony2FpId, sony2Id, 0x9402 }, { Tag::root, sony2CsId, sony2Id, 0x0114 }, { Tag::root, sony2Cs2Id, sony2Id, 0x0114 }, { Tag::root, minoltaId, exifId, 0x927c }, @@ -1418,6 +1438,10 @@ namespace Exiv2 { { Tag::all, sony1CsId, newTiffBinaryElement }, { Tag::all, sony1Cs2Id, newTiffBinaryElement }, + // Tag 0x9402 Sony2Fp Focus Position + { Tag::all, sony2FpId, newTiffBinaryElement }, + { 0x9402, sony2Id, EXV_BINARY_ARRAY(sony2FpCfg, sony2FpDef) }, + // Sony2 makernote { 0x0114, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2CsSet, sonyCsSelector) }, { Tag::next, sony2Id, ignoreTiffComponent }, diff --git a/src/tiffvisitor_int.cpp b/src/tiffvisitor_int.cpp index 38d69ccb39..a2ddf08c9e 100644 --- a/src/tiffvisitor_int.cpp +++ b/src/tiffvisitor_int.cpp @@ -36,6 +36,7 @@ #include "value.hpp" #include "image.hpp" #include "jpgimage.hpp" +#include "sonymn_int.hpp" #include "i18n.h" // NLS support. // + standard includes @@ -782,7 +783,10 @@ namespace Exiv2 { if (!object->initialize(pRoot_)) return; // Re-encrypt buffer if necessary - const CryptFct cryptFct = object->cfg()->cryptFct_; + CryptFct cryptFct = object->cfg()->cryptFct_; + if ( cryptFct == sonyTagDecipher ) { + cryptFct = sonyTagEncipher; + } if (cryptFct != 0) { const byte* pData = object->pData(); DataBuf buf = cryptFct(object->tag(), pData, size, pRoot_); diff --git a/test/data/exiv2-pr906.exv b/test/data/exiv2-pr906.exv new file mode 100644 index 0000000000000000000000000000000000000000..4cd8c9de4097a8826dff0607c708ebf86cbb57f8 GIT binary patch literal 49473 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 literal 0 HcmV?d00001 diff --git a/tests/bugfixes/github/test_pr_906.py b/tests/bugfixes/github/test_pr_906.py new file mode 100644 index 0000000000..d87bc474e0 --- /dev/null +++ b/tests/bugfixes/github/test_pr_906.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + +class Sony2FpTest(metaclass=CaseMeta): + + filename = path("$data_path/exiv2-pr906.exv") + commands = ["$exiv2 -pa --grep Sony2Fp $filename"] + + stdout = ["""Exif.Sony2Fp.AmbientTemperature SByte 1 19 +Exif.Sony2Fp.FocusMode Byte 1 6 +Exif.Sony2Fp.AFAreaMode Byte 1 12 +Exif.Sony2Fp.FocusPosition2 Byte 1 140 +""" + ] + stderr = [""] + retval = [0]