From cc9d780534bbb9e4a0a4e8de7dc5291112bc7e77 Mon Sep 17 00:00:00 2001 From: postscript-dev Date: Mon, 26 Jul 2021 10:40:54 +0100 Subject: [PATCH 1/3] Add SonyMisc3c makernote tags (tag 9400) Changes: + Add tags. Rename Exiftool `SequenceLength` tags to `SequenceLength1` and `SequenceLength2`, to prevent a name clash. + Update docs and manpage. Source: [Exiftool](https://exiftool.org) --- doc/templates/Makefile | 3 +- man/man1/exiv2.1 | 43 ++++---- src/makernote_int.cpp | 20 ++++ src/makernote_int.hpp | 11 ++ src/sonymn_int.cpp | 237 +++++++++++++++++++++++++++++++++++++++++ src/sonymn_int.hpp | 13 +++ src/tags_int.cpp | 1 + src/tags_int.hpp | 1 + src/tiffimage_int.cpp | 39 +++++++ 9 files changed, 346 insertions(+), 22 deletions(-) diff --git a/doc/templates/Makefile b/doc/templates/Makefile index 45da813d15..5cded7125a 100644 --- a/doc/templates/Makefile +++ b/doc/templates/Makefile @@ -113,7 +113,8 @@ TABLES = Exif \ Sony1MltCsA100 \ Sony2Fp \ SonyMisc1 \ - SonyMisc2b + SonyMisc2b \ + SonyMisc3c SCHEMA = xmp_dc \ xmp_dwc \ diff --git a/man/man1/exiv2.1 b/man/man1/exiv2.1 index eca1716eb1..3e0ffc38df 100644 --- a/man/man1/exiv2.1 +++ b/man/man1/exiv2.1 @@ -624,27 +624,28 @@ Exiv2 displays metadata tags and values. The tag is a triplet of Family.Group.Tagname. The following groups are defined for the family Exif: .sp 1 .nf -GPSInfo Canon Fujifilm NikonLd1 OlympusFe1 Pentax -Image CanonCf NikonLd2 OlympusFe2 PentaxDng -Image2 CanonCs Nikon1 NikonLd3 OlympusFe3 -Image3 CanonFi Nikon2 NikonMe OlympusFe4 Samsung2 -Iop CanonPa Nikon3 NikonPc OlympusFe5 SamsungPictureWizard -MakerNote CanonPi NikonAFT NikonPreview OlympusFe6 SamsungPreview -MpfInfo CanonPr NikonAf NikonSi01xx OlympusFe7 -Photo CanonSi NikonAf2 NikonSi02xx OlympusFe8 Sony1 -SubImage1 CanonTi NikonAf22 NikonSiD300a OlympusFe9 Sony1Cs -SubImage2 NikonCb1 NikonSiD300b OlympusFi Sony1Cs2 -SubImage3 Casio NikonCb2 NikonSiD40 OlympusIp Sony1MltCs7D -SubImage4 Casio2 NikonCb2a NikonSiD80 OlympusRd Sony1MltCsA100 -SubImage5 NikonCb3 NikonVr OlympusRd2 Sony1MltCsNew -SubImage6 Minolta NikonCb4 NikonWt OlympusRi Sony1MltCsOld -SubImage7 MinoltaCs5D NikonFi Sony2 -SubImage8 MinoltaCs7D NikonFl1 Olympus Panasonic Sony2Cs -SubImage9 MinoltaCsNew NikonFl2 Olympus2 PanasonicRaw Sony2Cs2 -SubThumb1 MinoltaCsOld NikonFl3 OlympusCs Sony2Fp -Thumbnail NikonIi OlympusEq Sigma SonyMisc1 - SonyMisc2b - SonyMinolta +GPSInfo Canon Fujifilm NikonMe OlympusFe7 SonyMisc2b +Image CanonCf NikonPc OlympusFe9 SonyMisc3c +Image2 CanonCs Nikon1 NikonPreview OlympusFi SonyMinolta +Image3 CanonFi Nikon2 NikonSi01xx OlympusIp +Iop CanonPa Nikon3 NikonSi02xx OlympusRd Samsung2 +MakerNote CanonPi NikonAFT NikonSiD300a OlympusRd2 SamsungPictureWizard +MpfInfo CanonPr NikonAf NikonSiD300b OlympusRi SamsungPreview +Photo CanonSi NikonAf2 NikonSiD40 +SubImage1 CanonTi NikonAf22 NikonSiD80 Sigma +SubImage2 NikonCb1 NikonVr +SubImage3 Casio NikonCb2 NikonWt Sony1 +SubImage4 Casio2 NikonCb2a Sony1Cs +SubImage5 NikonCb3 Olympus Sony1Cs2 +SubImage6 Minolta NikonCb4 Olympus2 Sony1MltCs7D +SubImage7 MinoltaCs5D NikonFi OlympusCs Sony1MltCsA100 +SubImage8 MinoltaCs7D NikonFl1 OlympusEq Sony1MltCsNew +SubImage9 MinoltaCsNew NikonFl2 OlympusFe1 Sony1MltCsOld +SubThumb1 MinoltaCsOld NikonFl3 OlympusFe2 Sony2 +Thumbnail NikonIi OlympusFe3 Sony2Cs + Panasonic NikonLd1 OlympusFe4 Sony2Cs2 +Pentax PanasonicRaw NikonLd2 OlympusFe5 Sony2Fp +PentaxDng NikonLd3 OlympusFe6 SonyMisc1 .fi .sp 1 Exiv2 supports Exif 2.2 Standard Tags. Exiv2 also supports reading and writing manufacturer's MakerNote. The information in Exif.Photo.MakerNote is encoded as manufacturer's sub-records. For example, CanonCs are Camera Settings, NikonAf are Nikon Auto Focus records, NikonCb are Nikon Color Balance Records. Every tag is defined by a unique tagId (16 bit integer) which is unique within a Group. diff --git a/src/makernote_int.cpp b/src/makernote_int.cpp index 48827d1550..6f9812666c 100644 --- a/src/makernote_int.cpp +++ b/src/makernote_int.cpp @@ -1224,6 +1224,26 @@ namespace Exiv2 { } return -1; } + int sonyMisc3cSelector(uint16_t /*tag*/, const byte* /*pData*/, uint32_t /*size*/, TiffComponent* const pRoot) + { + // From Exiftool (Tag 9400c): https://github.com/exiftool/exiftool/blob/master/lib/Image/ExifTool/Sony.pm + // > first byte decoded: 62, 48, 215, 28, 106 respectively + const auto value = getExifValue(pRoot, 0x9400, Exiv2::Internal::sony1Id); + if (!value || value->count() < 1) + return -1; + + switch (value->toLong()) { // Using encrypted values + case 35: // 35 == 62 + case 36: // 36 == 48 + case 38: // 38 == 215 + case 40: // 40 == 28 + case 49: // 112 == 106 + return 0; + default: + break; + } + return -1; + } } // namespace Internal } // namespace Exiv2 diff --git a/src/makernote_int.hpp b/src/makernote_int.hpp index e4a70fa613..df8a1ebd13 100644 --- a/src/makernote_int.hpp +++ b/src/makernote_int.hpp @@ -729,6 +729,17 @@ namespace Exiv2 { */ int sonyMisc2bSelector(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot); + /*! + @brief Function to select cfg + def of the SonyMisc3c (tag 9400) complex binary array. + + @param tag Tag number of the binary array + @param pData Pointer to the raw array data. + @param size Size of the array data. + @param pRoot Pointer to the root component of the TIFF tree. + @return An index into the array set, -1 if no match was found. + */ + int sonyMisc3cSelector(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot); + /*! @brief Function to select cfg + def of a Nikon complex binary array. diff --git a/src/sonymn_int.cpp b/src/sonymn_int.cpp index 0cc9fe6f31..b4fadec14b 100644 --- a/src/sonymn_int.cpp +++ b/src/sonymn_int.cpp @@ -279,6 +279,33 @@ namespace Exiv2 { { 65535, N_("n/a") } }; + //! Lookup table to translate Sony Release Mode 2 values to readable labels + constexpr TagDetails sonyReleaseMode2[] = { + { 0, N_("Normal") }, + { 1, N_("Continuous") }, + { 2, N_("Continuous - Exposure Bracketing") }, + { 3, N_("DRO or White Balance Bracketing") }, + { 5, N_("Continuous - Burst") }, + { 6, N_("Single Frame - Capture During Movie") }, + { 7, N_("Continuous - Sweep Panorama") }, + { 8, N_("Continuous - Anti-Motion Blur, Hand-held Twilight") }, + { 9, N_("Continuous - HDR") }, + { 10, N_("Continuous - Background defocus") }, + { 13, N_("Continuous - 3D Sweep Panorama") }, + { 15, N_("Continuous - High Resolution Sweep Panorama") }, + { 16, N_("Continuous - 3D Image") }, + { 17, N_("Continuous - Burst 2") }, + { 18, N_("Normal - iAuto+") }, + { 19, N_("Continuous - Speed/Advance Priority") }, + { 20, N_("Continuous - Multi-Frame NR") }, + { 23, N_("Single-frame - Exposure Bracketing") }, + { 26, N_("Continuous Low") }, + { 27, N_("Continuous - High Sensitivity") }, + { 28, N_("Smile Shutter") }, + { 29, N_("Continuous - Tele-zoom Advance Priority") }, + { 146, N_("Single Frame - Movie Capture") } + }; + //! Lookup table to translate Sony sequence number values to readable labels constexpr TagDetails sonySequenceNumber[] = { { 0, N_("Single") }, @@ -1011,6 +1038,216 @@ namespace Exiv2 { return os << value; } + //! Lookup table to translate Sony camera SonyMisc3c sequence length 1 values to readable labels + constexpr TagDetails sonyMisc3cSequenceLength1[] = { + { 0, N_("Continuous") }, + { 1, N_("1 shot") }, + { 2, N_("2 shots") }, + { 3, N_("3 shots") }, + { 4, N_("4 shots") }, + { 5, N_("5 shots") }, + { 6, N_("6 shots") }, + { 7, N_("7 shots") }, + { 9, N_("9 shots") }, + { 10, N_("10 shots") }, + { 12, N_("12 shots") }, + { 16, N_("16 shots") }, + { 100, N_("Continuous - iSweep Panorama") }, + { 200, N_("Continuous - Sweep Panorama") } + }; + + //! Lookup table to translate Sony camera SonyMisc3c sequence length 2 values to readable labels + constexpr TagDetails sonyMisc3cSequenceLength2[] = { + { 0, N_("Continuous") }, + { 1, N_("1 file") }, + { 2, N_("2 files") }, + { 3, N_("3 files") }, + { 5, N_("5 files") }, + { 7, N_("7 files") }, + { 9, N_("9 files") }, + { 10, N_("10 files") } + }; + + //! Lookup table to translate Sony camera SonyMisc3c, camera orientation values to readable labels + constexpr TagDetails sonyMisc3cCameraOrientation[] = { + { 1, N_("Horizontal (normal)") }, + { 3, N_("Rotate 180°") }, + { 6, N_("Rotate 90° CW") }, + { 8, N_("Rotate 270° CW") } + }; + + //! SonyMisc3c tags (Tag 9400c) + constexpr TagInfo SonyMakerNote::tagInfoSonyMisc3c_[] = { + {9, "ReleaseMode2", N_("Release mode 2"), + N_("Release mode 2"), + sonyMisc3cId, makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyReleaseMode2)}, + {10, "ShotNumberSincePowerUp",N_("Shot number since power up"), + N_("Number of photos taken since the camera was powered up"), + sonyMisc3cId, makerTags, unsignedLong, -1, printSonyMisc3cShotNumberSincePowerUp}, + {18, "SequenceImageNumber", N_("Sequence image number"), + N_("Number of images captured in burst sequence"), + sonyMisc3cId, makerTags, unsignedLong, -1, printSonyMisc3cSequenceNumber}, + // In Exiftool, "SequenceLength1" is called "SequenceLength. Renamed due to clash of names." + {22, "SequenceLength1", N_("Sequence length 1"), + N_("Length of the sequence of photos taken"), + sonyMisc3cId, makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength1)}, + {26, "SequenceFileNumber", N_("Sequence file number"), + N_("File number in burst sequence"), + sonyMisc3cId, makerTags, unsignedLong, -1, printSonyMisc3cSequenceNumber}, + // In Exiftool, "SequenceLength2" is called "SequenceLength". Renamed due to clash of names." + {30, "SequenceLength2", N_("Sequence length 2"), + N_("Length of the sequence of photos taken"), + sonyMisc3cId, makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength2)}, + {41, "CameraOrientation", N_("Camera orientation"), + N_("Orientation of the camera when the photo was taken"), + sonyMisc3cId, makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cCameraOrientation)}, + {42, "Quality2", N_("Quality 2"), + N_("Quality 2"), + sonyMisc3cId, makerTags, unsignedByte, -1, printSonyMisc3cQuality2}, + {71, "SonyImageHeight", N_("Sony image height"), + N_("Height of the image"), + sonyMisc3cId, makerTags, unsignedShort, -1, printSonyMisc3cSonyImageHeight}, + {83, "ModelReleaseYear", N_("Model release year"), + N_("Year that the model of camera was released"), + sonyMisc3cId, makerTags, unsignedByte, -1, printSonyMisc3cModelReleaseYear}, + // End of list marker + {0xffff, "(UnknownSonyMisc3c)", "(Unknown SonyMisc3c Tag)", + N_("Unknown SonyMisc23 tag"), + sonyMisc3cId, makerTags, asciiString, -1, printValue}, + }; + + const TagInfo* SonyMakerNote::tagListSonyMisc3c() + { + return tagInfoSonyMisc3c_; + } + + std::ostream& SonyMakerNote::printSonyMisc3cShotNumberSincePowerUp(std::ostream& os, const Value& value, const ExifData* metadata) + { + if (value.count() != 1) + return os << "(" << value << ")"; + + auto pos = metadata->findKey(ExifKey("Exif.Image.Model")); + if (pos == metadata->end()) + return os << "(" << value << ")"; + + // Models that support this tag + static constexpr const char* models[] = { "ILCA-68", "ILCA-77M2", "ILCA-99M2", + "ILCE-5000", "ILCE-5100", "ILCE-6000", "ILCE-6300", "ILCE-6500", "ILCE-7", + "ILCE-7M2", "ILCE-7R", "ILCE-7RM2", "ILCE-7S", "ILCE-7SM2", "ILCE-QX1", + "DSC-HX350", "DSC-HX400V", "DSC-HX60V", "DSC-HX80", "DSC-HX90", "DSC-HX90V", + "DSC-QX30", "DSC-RX0", "DSC-RX1RM2", "DSC-RX10", "DSC-RX10M2", "DSC-RX10M3", + "DSC-RX100M3", "DSC-RX100M4", "DSC-RX100M5", "DSC-WX220", "DSC-WX350", "DSC-WX500" + }; + + std::string model = pos->toString(); + for (auto& m : models) { + if (m == model) + return os << value.toLong(); + } + + return os << N_("n/a"); + } + + std::ostream& SonyMakerNote::printSonyMisc3cSequenceNumber(std::ostream& os, const Value& value, const ExifData*) + { + return (value.count() != 1) ? os << "(" << value << ")" : os << (value.toLong()+1); + } + + std::ostream& SonyMakerNote::printSonyMisc3cQuality2(std::ostream& os, const Value& value, const ExifData* metadata) + { + if (value.count() != 1) + return os << "(" << value << ")"; + + auto pos = metadata->findKey(ExifKey("Exif.Image.Model")); + if (pos == metadata->end()) + return os << "(" << value << ")"; + + long val = value.toLong(); + std::string model = pos->toString(); + + // Value is interpreted differently if model is in list or not + for (auto& m : { "ILCE-1", "ILCE-7SM3", "ILME-FX3" }) { + if (m == model) { + switch (val) { + case 1: + return os << N_("JPEG"); + case 2: + return os << N_("Raw"); + case 3: + return os << N_("Raw + JPEG"); + case 4: + return os << N_("HEIF"); + case 6: + return os << N_("Raw + HEIF"); + default: + return os << "(" << val << ")"; + } + } + } + + switch (val) { + case 0: + return os << N_("JPEG"); + case 1: + return os << N_("Raw"); + case 2: + return os << N_("Raw + JPEG"); + case 3: + return os << N_("Raw + MPO"); + default: + os << "(" << val << ")"; + } + return os; + } + + std::ostream& SonyMakerNote::printSonyMisc3cSonyImageHeight(std::ostream& os, const Value& value, const ExifData* metadata) + { + if (value.count() != 1) + return os << "(" << value << ")"; + + auto pos = metadata->findKey(ExifKey("Exif.Image.Model")); + if (pos == metadata->end()) + return os << "(" << value << ")"; + + std::string model = pos->toString(); + + // Models that do not support this tag + for (auto& m : { "ILCE-1", "ILCE-7SM3", "ILME-FX3" }) { + if (m == model) + return os << N_("n/a"); + } + + long val = value.toLong(); + return val > 0 ? os << (8*val) : os << N_("n/a"); + } + + std::ostream& SonyMakerNote::printSonyMisc3cModelReleaseYear(std::ostream& os, const Value& value, const ExifData* metadata) + { + if (value.count() != 1) + return os << "(" << value << ")"; + + auto pos = metadata->findKey(ExifKey("Exif.Image.Model")); + if (pos == metadata->end()) + return os << "(" << value << ")"; + + std::string model = pos->toString(); + + // Models that do not support this tag + for (auto& m : { "ILCE-1", "ILCE-7SM3", "ILME-FX3" }) { + if (m == model) + return os << N_("n/a"); + } + + long val = value.toLong(); + if (val > 99) + return os << "(" << val << ")"; + + if (val == 0) + return os << "2000"; + + return os << "20" << val; + } + //! Sony Tag 2010 Sony2010 (Miscellaneous) constexpr TagInfo SonyMakerNote::tagInfo2010e_[] = { {0, "SequenceImageNumber", N_("Sequence Image Number"), N_("Sequence Image Number"), sony2010eId, makerTags, unsignedLong, 1, printValue}, diff --git a/src/sonymn_int.hpp b/src/sonymn_int.hpp index 479a2f6d9d..df1fb7b9f9 100644 --- a/src/sonymn_int.hpp +++ b/src/sonymn_int.hpp @@ -53,6 +53,8 @@ namespace Exiv2 { static const TagInfo* tagListSonyMisc1(); //! Return read-only list of built-in Sony Misc2b tags (Tag 9404) static const TagInfo* tagListSonyMisc2b(); + //! Return read-only list of built-in Sony Misc3c tags (Tag 9400) + static const TagInfo* tagListSonyMisc3c(); static const TagInfo* tagList2010e(); @@ -68,6 +70,16 @@ namespace Exiv2 { static std::ostream& printSonyMisc2bLensZoomPosition(std::ostream&, const Value&, const ExifData* metadata); //! Print SonyMisc2b Focus Position 2 value static std::ostream& printSonyMisc2bFocusPosition2(std::ostream&, const Value&, const ExifData* metadata); + //! Print SonyMisc3c shot number since power up value + static std::ostream& printSonyMisc3cShotNumberSincePowerUp(std::ostream&, const Value&, const ExifData*); + //! Print SonyMisc3c sequence number + static std::ostream& printSonyMisc3cSequenceNumber(std::ostream&, const Value&, const ExifData*); + //! Print SonyMisc3c Sony image height value + static std::ostream& printSonyMisc3cSonyImageHeight(std::ostream&, const Value&, const ExifData* metadata); + //! Print SonyMisc3c model release year value + static std::ostream& printSonyMisc3cModelReleaseYear(std::ostream&, const Value&, const ExifData* metadata); + //! Print SonyMisc3c quality 2 value + static std::ostream& printSonyMisc3cQuality2(std::ostream&, const Value&, const ExifData* metadata); //! Print Sony Camera Model static std::ostream& print0xb000(std::ostream&, const Value&, const ExifData*); //! Print Full and Preview Image size @@ -81,6 +93,7 @@ namespace Exiv2 { static const TagInfo tagInfoFp_[]; static const TagInfo tagInfoSonyMisc1_[]; static const TagInfo tagInfoSonyMisc2b_[]; + static const TagInfo tagInfoSonyMisc3c_[]; static const TagInfo tagInfo2010e_[]; }; // class SonyMakerNote diff --git a/src/tags_int.cpp b/src/tags_int.cpp index 3668d45aa6..6f9c4a0587 100644 --- a/src/tags_int.cpp +++ b/src/tags_int.cpp @@ -169,6 +169,7 @@ namespace Exiv2 { { sony2FpId, "Makernote", "Sony2Fp", SonyMakerNote::tagListFp }, { sonyMisc1Id, "Makernote", "SonyMisc1", SonyMakerNote::tagListSonyMisc1}, { sonyMisc2bId, "Makernote", "SonyMisc2b", SonyMakerNote::tagListSonyMisc2b}, + { sonyMisc3cId, "Makernote", "SonyMisc3c", SonyMakerNote::tagListSonyMisc3c}, { sony2010eId, "Makernote", "Sony2010e", SonyMakerNote::tagList2010e }, { lastId, "(Last IFD info)", "(Last IFD item)", nullptr } }; diff --git a/src/tags_int.hpp b/src/tags_int.hpp index c71fb01986..cbc7aba2d1 100644 --- a/src/tags_int.hpp +++ b/src/tags_int.hpp @@ -176,6 +176,7 @@ namespace Exiv2 { sony2FpId, sonyMisc1Id, sonyMisc2bId, + sonyMisc3cId, sony2010eId, sony1MltCs7DId, sony1MltCsOldId, diff --git a/src/tiffimage_int.cpp b/src/tiffimage_int.cpp index 99c2973868..03965adad3 100644 --- a/src/tiffimage_int.cpp +++ b/src/tiffimage_int.cpp @@ -869,6 +869,35 @@ namespace Exiv2 { { sonyMisc2bCfg, sonyMisc2bDef, EXV_COUNTOF(sonyMisc2bDef) } }; + constexpr ArrayCfg sonyMisc3cCfg = { + sonyMisc3cId, // Group for the elements + littleEndian, // Little 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 } + }; + + constexpr ArrayDef sonyMisc3cDef[] = { + { 0x09, ttUnsignedByte , 1 }, // Exif.SonyMisc3c.ReleaseMode2 + { 0x0a, ttUnsignedLong , 1 }, // Exif.SonyMisc3c.ShotNumberSincePowerUp + { 0x12, ttUnsignedLong , 1 }, // Exif.SonyMisc3c.SequenceImageNumber + { 0x16, ttUnsignedByte , 1 }, // Exif.SonyMisc3c.SequenceLength1 + { 0x1a, ttUnsignedLong , 1 }, // Exif.SonyMisc3c.SequenceFileNumber + { 0x1e, ttUnsignedByte , 1 }, // Exif.SonyMisc3c.SequenceLength2 + { 0x29, ttUnsignedByte , 1 }, // Exif.SonyMisc3c.CameraOrientation + { 0x2a, ttUnsignedByte , 1 }, // Exif.SonyMisc3c.Quality2 + { 0x47, ttUnsignedShort , 1 }, // Exif.SonyMisc3c.SonyImageHeight + { 0x53, ttUnsignedByte , 1 }, // Exif.SonyMisc3c.ModelReleaseYear + }; + + //! SonyMisc3c Settings configurations and definitions + constexpr ArraySet sonyMisc3cSet[] = { + { sonyMisc3cCfg, sonyMisc3cDef, EXV_COUNTOF(sonyMisc3cDef) } + }; + constexpr ArrayCfg sony2010eCfg = { sony2010eId, // Group for the elements invalidByteOrder, // inherit from file. Usually littleEndian @@ -1141,6 +1170,7 @@ namespace Exiv2 { { Tag::root, sony2FpId, sony1Id, 0x9402 }, { Tag::root, sonyMisc1Id, sony1Id, 0x9403 }, { Tag::root, sonyMisc2bId, sony1Id, 0x9404 }, + { Tag::root, sonyMisc3cId, sony1Id, 0x9400 }, { Tag::root, sony1CsId, sony1Id, 0x0114 }, { Tag::root, sony1Cs2Id, sony1Id, 0x0114 }, { Tag::root, sonyMltId, sony1Id, 0xb028 }, @@ -1153,6 +1183,7 @@ namespace Exiv2 { { Tag::root, sony2FpId, sony2Id, 0x9402 }, { Tag::root, sonyMisc1Id, sony2Id, 0x9403 }, { Tag::root, sonyMisc2bId, sony2Id, 0x9404 }, + { Tag::root, sonyMisc3cId, sony2Id, 0x9400 }, { Tag::root, sony2CsId, sony2Id, 0x0114 }, { Tag::root, sony2Cs2Id, sony2Id, 0x0114 }, { Tag::root, minoltaId, exifId, 0x927c }, @@ -1595,6 +1626,10 @@ namespace Exiv2 { { Tag::all, sonyMisc2bId, newTiffBinaryElement }, { 0x9404, sony1Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc2bSet, sonyMisc2bSelector) }, + // Tag 0x9400 SonyMisc3c + { Tag::all, sonyMisc3cId, newTiffBinaryElement }, + { 0x9400, sony1Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc3cSet, sonyMisc3cSelector) }, + // Tag 0x9403 SonyMisc1 { Tag::all, sonyMisc1Id, newTiffBinaryElement }, { 0x9403, sony1Id, EXV_BINARY_ARRAY(sonyMisc1Cfg, sonyMisc1Def) }, @@ -1624,6 +1659,10 @@ namespace Exiv2 { { Tag::all, sonyMisc2bId, newTiffBinaryElement }, { 0x9404, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc2bSet, sonyMisc2bSelector) }, + // Tag 0x9400 SonyMisc3c + { Tag::all, sonyMisc3cId, newTiffBinaryElement }, + { 0x9400, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc3cSet, sonyMisc3cSelector) }, + // Sony2 makernote { 0x0114, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2CsSet, sonyCsSelector) }, { Tag::next, sony2Id, ignoreTiffComponent }, From f392e632410633b69875617c62743c4ff428d3af Mon Sep 17 00:00:00 2001 From: postscript-dev Date: Mon, 26 Jul 2021 11:28:05 +0100 Subject: [PATCH 2/3] Add testing for SonyMisc3c makernote tags (tag 9400) EXV files are extracted from Exiftool Sony Image samples: https://exiftool.org/sample_images.html --- test/data/exiv2-SonyDSC-HX60V.exv | Bin 0 -> 31657 bytes test/data/exiv2-SonyILCE-7SM3.exv | Bin 0 -> 41721 bytes tests/bugfixes/github/test_pr_1800.py | 57 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 test/data/exiv2-SonyDSC-HX60V.exv create mode 100644 test/data/exiv2-SonyILCE-7SM3.exv create mode 100644 tests/bugfixes/github/test_pr_1800.py diff --git a/test/data/exiv2-SonyDSC-HX60V.exv b/test/data/exiv2-SonyDSC-HX60V.exv new file mode 100644 index 0000000000000000000000000000000000000000..631714ad2974169185f22ac69cba1cd95ff69620 GIT binary patch literal 31657 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 literal 0 HcmV?d00001 diff --git a/test/data/exiv2-SonyILCE-7SM3.exv b/test/data/exiv2-SonyILCE-7SM3.exv new file mode 100644 index 0000000000000000000000000000000000000000..e56409e964f3ce88965328a19380d9c61bf0b33d GIT binary patch literal 41721 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 literal 0 HcmV?d00001 diff --git a/tests/bugfixes/github/test_pr_1800.py b/tests/bugfixes/github/test_pr_1800.py new file mode 100644 index 0000000000..7c46bc46d3 --- /dev/null +++ b/tests/bugfixes/github/test_pr_1800.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + +#Full support for SonyMisc3c tags using this model +class SonyMisc3cSupportedTest(metaclass=CaseMeta): + + filename = path("$data_path/exiv2-SonyDSC-HX60V.exv") + commands = ["$exiv2 -pa --grep SonyMisc3c $filename"] + + stdout = ["""Exif.SonyMisc3c.ReleaseMode2 Byte 1 Normal +Exif.SonyMisc3c.ShotNumberSincePowerUp Long 1 4 +Exif.SonyMisc3c.SequenceImageNumber Long 1 1 +Exif.SonyMisc3c.SequenceLength1 Byte 1 1 shot +Exif.SonyMisc3c.SequenceFileNumber Long 1 1 +Exif.SonyMisc3c.SequenceLength2 Byte 1 1 file +Exif.SonyMisc3c.CameraOrientation Byte 1 Horizontal (normal) +Exif.SonyMisc3c.Quality2 Byte 1 JPEG +Exif.SonyMisc3c.SonyImageHeight Short 1 3888 +Exif.SonyMisc3c.ModelReleaseYear Byte 1 2014 +""" + ] + stderr = [""] + retval = [0] + +#Partial support for SonyMisc3c tags using this model +class SonyMisc3cPartiallySupportedTest(metaclass=CaseMeta): + + filename = path("$data_path/exiv2-SonyILCE-7SM3.exv") + commands = ["$exiv2 -pa --grep SonyMisc3c $filename"] + + stdout = ["""Exif.SonyMisc3c.ReleaseMode2 Byte 1 Normal +Exif.SonyMisc3c.ShotNumberSincePowerUp Long 1 n/a +Exif.SonyMisc3c.SequenceImageNumber Long 1 1 +Exif.SonyMisc3c.SequenceLength1 Byte 1 1 shot +Exif.SonyMisc3c.SequenceFileNumber Long 1 1 +Exif.SonyMisc3c.SequenceLength2 Byte 1 1 file +Exif.SonyMisc3c.CameraOrientation Byte 1 Horizontal (normal) +Exif.SonyMisc3c.Quality2 Byte 1 Raw + JPEG +Exif.SonyMisc3c.SonyImageHeight Short 1 n/a +Exif.SonyMisc3c.ModelReleaseYear Byte 1 n/a +""" + ] + stderr = [""] + retval = [0] + + +# No support for SonyMisc3c tags using this model +class SonyMisc3cUnsupportedTest(metaclass=CaseMeta): + + filename = path("$data_path/test_issue_1464.exv") + commands = ["$exiv2 -pa --grep SonyMisc3c $filename"] + + stdout = ["""""" + ] + stderr = [""] + retval = [1] From a82b6ceea5fa703d8f2dba25cdb80a35b98e8c2b Mon Sep 17 00:00:00 2001 From: postscript-dev Date: Tue, 27 Jul 2021 09:20:32 +0100 Subject: [PATCH 3/3] Update last modified date in manpage --- man/man1/exiv2.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/man1/exiv2.1 b/man/man1/exiv2.1 index 3e0ffc38df..ea481d70c9 100644 --- a/man/man1/exiv2.1 +++ b/man/man1/exiv2.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH EXIV2 1 "Mar 10, 2021" +.TH EXIV2 1 "July 27, 2021" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: