// SPDX-License-Identifier: GPL-2.0-or-later // included header files #include "sonymn_int.hpp" #include "exif.hpp" #include "i18n.h" // NLS support. #include "minoltamn_int.hpp" #include "tiffcomposite_int.hpp" #include "value.hpp" #include #include // ***************************************************************************** // class member definitions namespace Exiv2::Internal { // -- Standard Sony Makernotes tags --------------------------------------------------------------- //! Lookup table to translate Sony Auto HDR values to readable labels constexpr TagDetails sonyHDRMode[] = {{0x00000, N_("Off")}, {0x10001, N_("Auto")}, {0x10010, "1"}, {0x10012, "2"}, {0x10014, "3"}, {0x10016, "4"}, {0x10018, "5"}}; //! Lookup table to translate Sony model ID values to readable labels constexpr TagDetails sonyModelId[] = {{2, "DSC-R1"}, {256, "DSLR-A100"}, {257, "DSLR-A900"}, {258, "DSLR-A700"}, {259, "DSLR-A200"}, {260, "DSLR-A350"}, {261, "DSLR-A300"}, {262, "DSLR-A900 (APS-C mode)"}, {263, "DSLR-A380/A390"}, {264, "DSLR-A330"}, {265, "DSLR-A230"}, {266, "DSLR-A290"}, {269, "DSLR-A850"}, {270, "DSLR-A850 (APS-C mode)"}, {273, "DSLR-A550"}, {274, "DSLR-A500"}, {275, "DSLR-A450"}, {278, "NEX-5"}, {279, "NEX-3"}, {280, "SLT-A33"}, {281, "SLT-A55 / SLT-A55V"}, {282, "DSLR-A560"}, {283, "DSLR-A580"}, {284, "NEX-C3"}, {285, "SLT-A35"}, {286, "SLT-A65 / SLT-A65V"}, {287, "SLT-A77 / SLT-A77V"}, {288, "NEX-5N"}, {289, "NEX-7"}, {290, "NEX-VG20E"}, {291, "SLT-A37"}, {292, "SLT-A57"}, {293, "NEX-F3"}, {294, "SLT-A99 / SLT-A99V"}, {295, "NEX-6"}, {296, "NEX-5R"}, {297, "DSC-RX100"}, {298, "DSC-RX1"}, {299, "NEX-VG900"}, {300, "NEX-VG30E"}, {302, "ILCE-3000 / ILCE-3500"}, {303, "SLT-A58"}, {305, "NEX-3N"}, {306, "ILCE-7"}, {307, "NEX-5T"}, {308, "DSC-RX100M2"}, {309, "DSC-RX10"}, {310, "DSC-RX1R"}, {311, "ILCE-7R"}, {312, "ILCE-6000"}, {313, "ILCE-5000"}, {317, "DSC-RX100M3"}, {318, "ILCE-7S"}, {319, "ILCA-77M2"}, {339, "ILCE-5100"}, {340, "ILCE-7M2"}, {341, "DSC-RX100M4"}, {342, "DSC-RX10M2"}, {344, "DSC-RX1RM2"}, {346, "ILCE-QX1"}, {347, "ILCE-7RM2"}, {350, "ILCE-7SM2"}, {353, "ILCA-68"}, {354, "ILCA-99M2"}, {355, "DSC-RX10M3"}, {356, "DSC-RX100M5"}, {357, "ILCE-6300"}}; //! Lookup table to translate Sony dynamic range optimizer values to readable labels constexpr TagDetails print0xb025[] = {{0, N_("Off")}, {1, N_("Standard")}, {2, N_("Advanced Auto")}, {3, N_("Auto")}, {8, N_("Advanced Lv1")}, {9, N_("Advanced Lv2")}, {10, N_("Advanced Lv3")}, {11, N_("Advanced Lv4")}, {12, N_("Advanced Lv5")}, {16, "1"}, {17, "2"}, {18, "3"}, {19, "4"}, {20, "5"}}; //! Lookup table to translate Sony exposure mode values to readable labels constexpr TagDetails sonyExposureMode[] = {{0, N_("Auto")}, {1, N_("Portrait")}, {2, N_("Beach")}, {3, N_("Sports")}, {4, N_("Snow")}, {5, N_("Landscape")}, {6, N_("Program")}, {7, N_("Aperture priority")}, {8, N_("Shutter priority")}, {9, N_("Night Scene / Twilight")}, {10, N_("Hi-Speed Shutter")}, {11, N_("Twilight Portrait")}, {12, N_("Soft Snap / Portrait")}, {13, N_("Fireworks")}, {14, N_("Smile Shutter")}, {15, N_("Manual")}, {18, N_("High Sensitivity")}, {19, N_("Macro")}, {20, N_("Advanced Sports Shooting")}, {29, N_("Underwater")}, {33, N_("Food")}, {34, N_("Sweep Panorama")}, {35, N_("Handheld Night Shot")}, {36, N_("Anti Motion Blur")}, {37, N_("Pet")}, {38, N_("Backlight Correction HDR")}, {39, N_("Superior Auto")}, {40, N_("Background Defocus")}, {41, N_("Soft Skin")}, {42, N_("3D Image")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony JPEG Quality values to readable labels constexpr TagDetails sonyJPEGQuality[] = { {0, N_("Normal")}, {1, N_("Fine")}, {2, N_("Extra Fine")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony anti-blur values to readable labels constexpr TagDetails sonyAntiBlur[] = { {0, N_("Off")}, {1, N_("On (Continuous)")}, {2, N_("On (Shooting)")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony dynamic range optimizer values to readable labels constexpr TagDetails print0xb04f[] = {{0, N_("Off")}, {1, N_("Standard")}, {2, N_("Plus")}}; //! Lookup table to translate Sony Intelligent Auto values to readable labels constexpr TagDetails sonyIntelligentAuto[] = {{0, N_("Off")}, {1, N_("On")}, {2, N_("Advanced")}}; //! Lookup table to translate Sony WB values to readable labels constexpr TagDetails sonyWhiteBalance[] = {{0, N_("Auto")}, {4, N_("Manual")}, {5, N_("Daylight")}, {6, N_("Cloudy")}, {7, N_("White Fluorescent")}, {8, N_("Cool White Fluorescent")}, {9, N_("Day White Fluorescent")}, {10, N_("Incandescent2")}, {11, N_("Warm White Fluorescent")}, {14, N_("Incandescent")}, {15, N_("Flash")}, {17, N_("Underwater 1 (Blue Water)")}, {18, N_("Underwater 2 (Green Water)")}}; //! Lookup table to translate Sony AF mode values to readable labels constexpr TagDetails sonyFocusMode[] = {{1, "AF-S"}, {2, "AF-C"}, {4, N_("Permanent-AF")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony AF mode values to readable labels constexpr TagDetails sonyAFMode[] = {{0, N_("Default")}, {1, N_("Multi AF")}, {2, N_("Center AF")}, {3, N_("Spot AF")}, {4, N_("Flexible Spot AF")}, {6, N_("Touch AF")}, {14, N_("Manual Focus")}, {15, N_("Face Detected")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony AF illuminator values to readable labels constexpr TagDetails sonyAFIlluminator[] = {{0, N_("Off")}, {1, N_("Auto")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony macro mode values to readable labels constexpr TagDetails sonyMacroMode[] = {{0, N_("Off")}, {1, N_("On")}, {2, N_("Close Focus")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony flash level values to readable labels constexpr TagDetails sonyFlashLevel[] = {{-32768, N_("Low")}, {-1, N_("n/a")}, {0, N_("Normal")}, {32767, N_("High")}}; //! Lookup table to translate Sony release mode values to readable labels constexpr TagDetails sonyReleaseMode[] = {{0, N_("Normal")}, {2, N_("Burst")}, {5, N_("Exposure Bracketing")}, {6, N_("White Balance Bracketing")}, {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")}, {65535, N_("n/a")}}; //! Lookup table to translate Sony long exposure noise reduction values to readable labels constexpr TagDetails sonyLongExposureNoiseReduction[] = {{0, N_("Off")}, {1, N_("On")}, {65535, N_("n/a")}}; std::ostream& SonyMakerNote::print0xb000(std::ostream& os, const Value& value, const ExifData*) { if (value.count() != 4) { os << "(" << value << ")"; } else { std::string val = value.toString(0) + value.toString(1) + value.toString(2) + value.toString(3); if (val == "0002") os << "JPEG"; else if (val == "1000") os << "SR2"; else if (val == "2000") os << "ARW 1.0"; else if (val == "3000") os << "ARW 2.0"; else if (val == "3100") os << "ARW 2.1"; else if (val == "3200") os << "ARW 2.2"; else if (val == "3300") os << "ARW 2.3"; else if (val == "3310") os << "ARW 2.3.1"; else if (val == "3320") os << "ARW 2.3.2"; else os << "(" << value << ")"; } return os; } std::ostream& SonyMakerNote::printImageSize(std::ostream& os, const Value& value, const ExifData*) { if (value.count() == 2) os << value.toString(0) << " x " << value.toString(1); else os << "(" << value << ")"; return os; } // Sony MakerNote Tag Info constexpr TagInfo SonyMakerNote::tagInfo_[] = { {0x0102, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyImageQuality}, {0x0104, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"), IfdId::sony1Id, SectionId::makerTags, signedRational, -1, print0x9204}, {0x0105, "Teleconverter", N_("Teleconverter Model"), N_("Teleconverter Model"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyTeleconverterModel}, {0x0112, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune Value"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printValue}, {0x0114, "CameraSettings", N_("Camera Settings"), N_("Camera Settings"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyWhiteBalanceStd}, {0x0116, "0x0116", "0x0116", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0x0E00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0x1000, "MultiBurstMode", N_("Multi Burst Mode"), N_("Multi Burst Mode"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printMinoltaSonyBoolValue}, {0x1001, "MultiBurstImageWidth", N_("Multi Burst Image Width"), N_("Multi Burst Image Width"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, printValue}, {0x1002, "MultiBurstImageHeight", N_("Multi Burst Image Height"), N_("Multi Burst Image Height"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, printValue}, // TODO : Implement Panorama tags decoding. {0x1003, "Panorama", N_("Panorama"), N_("Panorama"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0x2000, "0x2000", "0x2000", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0x2001, "PreviewImage", N_("Preview Image"), N_("JPEG preview image"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0x2002, "0x2002", "0x2002", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printValue}, {0x2003, "0x2003", "0x2003", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, asciiString, -1, printValue}, {0x2004, "Contrast", "Contrast", N_("Contrast"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, {0x2005, "Saturation", "Saturation", N_("Saturation"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, {0x2006, "0x2006", "0x2006", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, {0x2007, "0x2007", "0x2007", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, {0x2008, "0x2008", "0x2008", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, {0x2009, "0x2009", "0x2009", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, printValue}, {0x200A, "AutoHDR", N_("Auto HDR"), N_("High Definition Range Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(sonyHDRMode)}, // TODO : Implement Shot Info tags decoding. {0x3000, "ShotInfo", N_("Shot Info"), N_("Shot Information"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0xB000, "FileFormat", N_("File Format"), N_("File Format"), IfdId::sony1Id, SectionId::makerTags, unsignedByte, -1, print0xb000}, {0xB001, "SonyModelID", N_("Sony Model ID"), N_("Sony Model ID"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyModelId)}, {0xB020, "ColorReproduction", N_("Color Reproduction"), N_("Color Reproduction"), IfdId::sony1Id, SectionId::makerTags, asciiString, -1, printValue}, {0xb021, "ColorTemperature", N_("Color Temperature"), N_("Color Temperature"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printValue}, {0xB022, "ColorCompensationFilter", N_("Color Compensation Filter"), N_("Color Compensation Filter: negative is green, positive is magenta"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printValue}, {0xB023, "SceneMode", N_("Scene Mode"), N_("Scene Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonySceneMode}, {0xB024, "ZoneMatching", N_("Zone Matching"), N_("Zone Matching"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyZoneMatching}, {0xB025, "DynamicRangeOptimizer", N_("Dynamic Range Optimizer"), N_("Dynamic Range Optimizer"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(print0xb025)}, {0xB026, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyBoolValue}, {0xB027, "LensID", N_("Lens ID"), N_("Lens identifier"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyLensID}, {0xB028, "MinoltaMakerNote", N_("Minolta MakerNote"), N_("Minolta MakerNote"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, {0xB029, "ColorMode", N_("Color Mode"), N_("Color Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyColorMode}, {0xB02B, "FullImageSize", N_("Full Image Size"), N_("Full Image Size"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printImageSize}, {0xB02C, "PreviewImageSize", N_("Preview Image Size"), N_("Preview image size"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printImageSize}, {0xB040, "Macro", N_("Macro"), N_("Macro"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyMacroMode)}, {0xB041, "ExposureMode", N_("Exposure Mode"), N_("Exposure Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyExposureMode)}, {0xB042, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyFocusMode)}, {0xB043, "AFMode", N_("AF Mode"), N_("AF Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyAFMode)}, {0xB044, "AFIlluminator", N_("AF Illuminator"), N_("AF Illuminator"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyAFIlluminator)}, {0xB047, "JPEGQuality", N_("JPEG Quality"), N_("JPEG Quality"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyJPEGQuality)}, {0xB048, "FlashLevel", N_("Flash Level"), N_("Flash Level"), IfdId::sony1Id, SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(sonyFlashLevel)}, {0xB049, "ReleaseMode", N_("Release Mode"), N_("Release Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyReleaseMode)}, {0xB04A, "SequenceNumber", N_("Sequence Number"), N_("Shot number in continuous burst mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonySequenceNumber)}, {0xB04B, "AntiBlur", N_("Anti-Blur"), N_("Anti-Blur"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyAntiBlur)}, {0xB04E, "LongExposureNoiseReduction", N_("Long Exposure Noise Reduction"), N_("Long Exposure Noise Reduction"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyLongExposureNoiseReduction)}, {0xB04F, "DynamicRangeOptimizer", N_("Dynamic Range Optimizer"), N_("Dynamic Range Optimizer"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(print0xb04f)}, {0xB052, "IntelligentAuto", N_("Intelligent Auto"), N_("Intelligent Auto"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyIntelligentAuto)}, {0xB054, "WhiteBalance2", N_("White Balance 2"), N_("White balance 2"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyWhiteBalance)}, // End of list marker {0xffff, "(UnknownSony1MakerNoteTag)", "(UnknownSony1MakerNoteTag)", N_("Unknown Sony1MakerNote tag"), IfdId::sony1Id, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* SonyMakerNote::tagList() { return tagInfo_; } // -- Sony camera settings --------------------------------------------------------------- //! Lookup table to translate Sony camera settings drive mode values to readable labels constexpr TagDetails sonyDriveModeStd[] = { {0x01, N_("Single Frame")}, {0x02, N_("Continuous High")}, {0x04, N_("Self-timer 10 sec")}, {0x05, N_("Self-timer 2 sec, Mirror Lock-up")}, {0x06, N_("Single-frame Bracketing")}, {0x07, N_("Continuous Bracketing")}, {0x0a, N_("Remote Commander")}, {0x0b, N_("Mirror Lock-up")}, {0x12, N_("Continuous Low")}, {0x18, N_("White Balance Bracketing Low")}, {0x19, N_("D-Range Optimizer Bracketing Low")}, {0x28, N_("White Balance Bracketing High")}, {0x29, N_("D-Range Optimizer Bracketing High")}, {0x29, N_("D-Range Optimizer Bracketing High")} // To silence compiler warning }; //! Lookup table to translate Sony camera settings focus mode values to readable labels constexpr TagDetails sonyCSFocusMode[] = {{0, N_("Manual")}, {1, "AF-S"}, {2, "AF-C"}, {3, "AF-A"}}; //! Lookup table to translate Sony camera settings metering mode values to readable labels constexpr TagDetails sonyMeteringMode[] = { {1, N_("Multi-segment")}, {2, N_("Center weighted average")}, {4, N_("Spot")}}; //! Lookup table to translate Sony camera settings creative style values to readable labels constexpr TagDetails sonyCreativeStyle[] = { {1, N_("Standard")}, {2, N_("Vivid")}, {3, N_("Portrait")}, {4, N_("Landscape")}, {5, N_("Sunset")}, {6, N_("Night View/Portrait")}, {8, N_("Black & White")}, {9, N_("Adobe RGB")}, {11, N_("Neutral")}, {12, N_("Clear")}, {13, N_("Deep")}, {14, N_("Light")}, {15, N_("Autumn")}, {16, N_("Sepia")}}; //! Lookup table to translate Sony camera settings flash mode values to readable labels constexpr TagDetails sonyFlashMode[] = { {0, N_("ADI")}, {1, N_("TTL")}, }; //! Lookup table to translate Sony AF illuminator values to readable labels constexpr TagDetails sonyAFIlluminatorCS[] = {{0, N_("Auto")}, {1, N_("Off")}}; //! Lookup table to translate Sony camera settings image style values to readable labels constexpr TagDetails sonyImageStyle[] = {{1, N_("Standard")}, {2, N_("Vivid")}, {3, N_("Portrait")}, {4, N_("Landscape")}, {5, N_("Sunset")}, {7, N_("Night View/Portrait")}, {8, N_("B&W")}, {9, N_("Adobe RGB")}, {11, N_("Neutral")}, {129, N_("StyleBox1")}, {130, N_("StyleBox2")}, {131, N_("StyleBox3")}, {132, N_("StyleBox4")}, {133, N_("StyleBox5")}, {134, N_("StyleBox6")}}; //! Lookup table to translate Sony camera settings exposure program values to readable labels constexpr TagDetails sonyExposureProgram[] = {{0, N_("Auto")}, {1, N_("Manual")}, {2, N_("Program AE")}, {3, N_("Aperture-priority AE")}, {4, N_("Shutter speed priority AE")}, {8, N_("Program Shift A")}, {9, N_("Program Shift S")}, {16, N_("Portrait")}, {17, N_("Sports")}, {18, N_("Sunset")}, {19, N_("Night Portrait")}, {20, N_("Landscape")}, {21, N_("Macro")}, {35, N_("Auto No Flash")}}; //! Lookup table to translate Sony camera settings image size values to readable labels constexpr TagDetails sonyImageSize[] = {{1, N_("Large")}, {2, N_("Medium")}, {3, N_("Small")}}; //! Lookup table to translate Sony aspect ratio values to readable labels constexpr TagDetails sonyAspectRatio[] = {{1, "3:2"}, {2, "16:9"}}; //! Lookup table to translate Sony exposure level increments values to readable labels constexpr TagDetails sonyExposureLevelIncrements[] = {{33, "1/3 EV"}, {50, "1/2 EV"}}; // Sony Camera Settings Tag Info // NOTE: all are for A200, A230, A300, A350, A700, A850 and A900 Sony model excepted // some entries which are only relevant with A700. // Warnings: Exiftool database give a list of tags shorted in decimal mode, not hexadecimal. constexpr TagInfo SonyMakerNote::tagInfoCs_[] = { // NOTE: A700 only {0x0004, "DriveMode", N_("Drive Mode"), N_("Drive Mode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyDriveModeStd)}, // NOTE: A700 only {0x0006, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune"), IfdId::sony1CsId, SectionId::makerTags, signedShort, 1, printValue}, {0x0010, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCSFocusMode)}, {0x0011, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyAFAreaMode}, {0x0012, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, {0x0015, "MeteringMode", N_("Metering Mode"), N_("Metering Mode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringMode)}, {0x0016, "ISOSetting", N_("ISO Setting"), N_("ISO Setting"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, {0x0018, "DynamicRangeOptimizerMode", N_("Dynamic Range Optimizer Mode"), N_("Dynamic Range Optimizer Mode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, {0x0019, "DynamicRangeOptimizerLevel", N_("Dynamic Range Optimizer Level"), N_("Dynamic Range Optimizer Level"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, {0x001A, "CreativeStyle", N_("Creative Style"), N_("Creative Style"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCreativeStyle)}, {0x001C, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, {0x001D, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, {0x001E, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, {0x001F, "ZoneMatchingValue", N_("Zone Matching Value"), N_("Zone Matching Value"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, {0x0022, "Brightness", N_("Brightness"), N_("Brightness"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, {0x0023, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFlashMode)}, // NOTE: A700 only {0x0028, "PrioritySetupShutterRelease", N_("Priority Setup Shutter Release"), N_("Priority Setup Shutter Release"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyPrioritySetupShutterRelease}, // NOTE: A700 only {0x0029, "AFIlluminator", N_("AF Illuminator"), N_("AF Illuminator"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyAFIlluminatorCS)}, // NOTE: A700 only {0x002A, "AFWithShutter", N_("AF With Shutter"), N_("AF With Shutter"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolInverseValue}, // NOTE: A700 only {0x002B, "LongExposureNoiseReduction", N_("Long Exposure Noise Reduction"), N_("Long Exposure Noise Reduction"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, // NOTE: A700 only {0x002C, "HighISONoiseReduction", N_("High ISO NoiseReduction"), N_("High ISO NoiseReduction"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, // NOTE: A700 only {0x002D, "ImageStyle", N_("Image Style"), N_("Image Style"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyImageStyle)}, {0x003C, "ExposureProgram", N_("Exposure Program"), N_("Exposure Program"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureProgram)}, {0x003D, "ImageStabilization", N_("Image Stabilization"), N_("Image Stabilization"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, {0x003F, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyRotation}, {0x0054, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyImageSize)}, {0x0055, "AspectRatio", N_("Aspect Ratio"), N_("Aspect Ratio"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyAspectRatio)}, {0x0056, "Quality", N_("Quality"), N_("Quality"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyQualityCs}, {0x0058, "ExposureLevelIncrements", N_("Exposure Level Increments"), N_("Exposure Level Increments"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureLevelIncrements)}, // End of list marker {0xffff, "(UnknownSony1CsTag)", "(UnknownSony1CsTag)", N_("Unknown Sony1 Camera Settings tag"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* SonyMakerNote::tagListCs() { return tagInfoCs_; } // -- Sony camera settings 2 --------------------------------------------------------------- // Sony Camera Settings Tag Version 2 Info // NOTE: for A330, A380, A450, A500, A550 Sony model // Warnings: Exiftool database give a list of tags shorted in decimal mode, not hexadecimal. constexpr TagInfo SonyMakerNote::tagInfoCs2_[] = { {0x0010, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCSFocusMode)}, {0x0011, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyAFAreaMode}, {0x0012, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, {0x0013, "MeteringMode", N_("Metering Mode"), N_("Metering Mode"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringMode)}, {0x0014, "ISOSetting", N_("ISO Setting"), N_("ISO Setting"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, {0x0016, "DynamicRangeOptimizerMode", N_("Dynamic Range Optimizer Mode"), N_("Dynamic Range Optimizer Mode"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, {0x0017, "DynamicRangeOptimizerLevel", N_("Dynamic Range Optimizer Level"), N_("Dynamic Range Optimizer Level"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, {0x0018, "CreativeStyle", N_("Creative Style"), N_("Creative Style"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCreativeStyle)}, {0x0019, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, {0x001A, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, {0x001B, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, {0x0023, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFlashMode)}, {0x003C, "ExposureProgram", N_("Exposure Program"), N_("Exposure Program"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureProgram)}, {0x003F, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyRotation}, {0x0054, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyImageSize)}, // End of list marker {0xffff, "(UnknownSony1Cs2Tag)", "(UnknownSony1Cs2Tag)", N_("Unknown Sony1 Camera Settings 2 tag"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* SonyMakerNote::tagListCs2() { return tagInfoCs2_; } //! Lookup table to translate Sony2Fp AF Area Mode values to readable labels constexpr TagDetails sony2FpAFAreaMode[] = {{0, N_("Multi")}, {1, N_("Center")}, {2, N_("Spot")}, {3, N_("Flexible Spot")}, {10, N_("Selective (for Miniature effect)")}, {11, N_("Zone")}, {12, N_("Expanded Flexible Spot")}, {14, N_("Tracking")}, {15, N_("Face Tracking")}, {20, N_("Animal Eye Tracking")}, {255, N_("Manual")}}; //! Sony Tag 9402 Sony2Fp (FocusPosition) constexpr TagInfo SonyMakerNote::tagInfoFp_[] = { {0x04, "AmbientTemperature", N_("Ambient temperature"), N_("Temperature of the surroundings (in degrees Celsius)"), IfdId::sony2FpId, SectionId::makerTags, signedByte, 1, printSony2FpAmbientTemperature}, {0x16, "FocusMode", N_("Focus mode"), N_("Focus mode"), IfdId::sony2FpId, SectionId::makerTags, unsignedByte, 1, printSony2FpFocusMode}, {0x17, "AFAreaMode", N_("AF area mode"), N_("Auto focus area mode"), IfdId::sony2FpId, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(sony2FpAFAreaMode)}, {0x2d, "FocusPosition2", N_("Focus position 2"), N_("Focus position 2"), IfdId::sony2FpId, SectionId::makerTags, unsignedByte, 1, printSony2FpFocusPosition2}, // End of list marker {0xffff, "(UnknownSony2FpTag)", "(Unknown Sony2Fp tag)", "(Unknown Sony2Fp tag)", IfdId::sony2FpId, SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* SonyMakerNote::tagListFp() { return tagInfoFp_; } std::ostream& SonyMakerNote::printSony2FpAmbientTemperature(std::ostream& os, const Value& value, const ExifData* metadata) { if (value.count() != 1) return os << "(" << value << ")"; auto pos = metadata->findKey(ExifKey("Exif.Sony2Fp.0x0002")); if (pos != metadata->end() && pos->count() == 1 && pos->toInt64() == 255) return os << value << " °C"; return os << N_("n/a"); } std::ostream& SonyMakerNote::printSony2FpFocusMode(std::ostream& os, const Value& value, const ExifData*) { if (value.count() != 1) os << value; else { const auto val = (value.toInt64() & 0x7F); switch (val) { case 0: os << N_("Manual"); break; case 2: os << N_("AF-S"); break; case 3: os << N_("AF-C"); break; case 4: os << N_("AF-A"); break; case 6: os << N_("DMF"); break; default: os << "(" << val << ")"; } } return os; } std::ostream& SonyMakerNote::printSony2FpFocusPosition2(std::ostream& os, const Value& value, const ExifData* metadata) { if (value.count() != 1) os << "(" << value << ")"; else { auto pos = metadata->findKey(ExifKey("Exif.Image.Model")); if (pos == metadata->end()) return os << "(" << value << ")"; // Ranges of models that do not support this tag std::string model = pos->toString(); for (auto& m : {"DSC-", "Stellar"}) { if (model.find(m) == 0) { os << N_("n/a"); return os; } } const auto val = value.toInt64(); if (val == 255) os << N_("Infinity"); else os << val; } return os; } //! Sony Tag 9403 SonyMisc1 constexpr TagInfo SonyMakerNote::tagInfoSonyMisc1_[] = { {0x05, "CameraTemperature", N_("Camera temperature"), N_("Internal camera temperature (in degrees Celsius)"), IfdId::sonyMisc1Id, SectionId::makerTags, signedByte, -1, printSonyMisc1CameraTemperature}, // End of list marker {0xffff, "(UnknownSonyMisc1Tag)", "(UnknownSonyMisc1Tag)", "(UnknownSonyMisc1Tag)", IfdId::sonyMisc1Id, SectionId::makerTags, unsignedByte, -1, printValue}}; const TagInfo* SonyMakerNote::tagListSonyMisc1() { return tagInfoSonyMisc1_; } std::ostream& SonyMakerNote::printSonyMisc1CameraTemperature(std::ostream& os, const Value& value, const ExifData* metadata) { if (value.count() != 1) return os << "(" << value << ")"; auto pos = metadata->findKey(ExifKey("Exif.SonyMisc1.0x0004")); if (pos != metadata->end() && pos->count() == 1 && pos->toInt64() != 0 && pos->toInt64() < 100) return os << value << " °C"; return os << N_("n/a"); } //! Lookup table to translate Sony Exposure Program 3 values to readable labels constexpr TagDetails sonyExposureProgram3[] = {{0, N_("Program AE")}, {1, N_("Aperture-priority AE")}, {2, N_("Shutter speed priority AE")}, {3, N_("Manual")}, {4, N_("Auto")}, {5, N_("iAuto")}, {6, N_("Superior Auto")}, {7, N_("iAuto+")}, {8, N_("Portrait")}, {9, N_("Landscape")}, {10, N_("Twilight")}, {11, N_("Twilight Portrait")}, {12, N_("Sunset")}, {14, N_("Action (High speed)")}, {16, N_("Sports")}, {17, N_("Handheld Night Shot")}, {18, N_("Anti Motion Blur")}, {19, N_("High Sensitivity")}, {21, N_("Beach")}, {22, N_("Snow")}, {23, N_("Fireworks")}, {26, N_("Underwater")}, {27, N_("Gourmet")}, {28, N_("Pet")}, {29, N_("Macro")}, {30, N_("Backlight Correction HDR")}, {33, N_("Sweep Panorama")}, {36, N_("Background Defocus")}, {37, N_("Soft Skin")}, {42, N_("3D Image")}, {43, N_("Cont. Priority AE")}, {45, N_("Document")}, {46, N_("Party")}}; //! Sony Tag 9404b SonyMisc2b tags constexpr TagInfo SonyMakerNote::tagInfoSonyMisc2b_[] = { {12, "ExposureProgram", N_("Exposure program"), N_("Exposure program"), IfdId::sonyMisc2bId, SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyExposureProgram3)}, {14, "IntelligentAuto", N_("Intelligent auto"), N_("Whether intelligent auto was used"), IfdId::sonyMisc2bId, SectionId::makerTags, unsignedByte, -1, printMinoltaSonyBoolValue}, {30, "LensZoomPosition", N_("Lens zoom position"), N_("Lens zoom position (in %)"), IfdId::sonyMisc2bId, SectionId::makerTags, unsignedShort, -1, printSonyMisc2bLensZoomPosition}, {32, "FocusPosition2", N_("Focus position 2"), N_("Focus position 2"), IfdId::sonyMisc2bId, SectionId::makerTags, unsignedByte, -1, printSonyMisc2bFocusPosition2}, // End of list marker {0xffff, "(UnknownSonyMisc2bTag)", "(Unknown SonyMisc2b tag)", "(Unknown SonyMisc2b tag)", IfdId::sonyMisc2bId, SectionId::makerTags, unsignedByte, -1, printValue}}; const TagInfo* SonyMakerNote::tagListSonyMisc2b() { return tagInfoSonyMisc2b_; } std::ostream& SonyMakerNote::printSonyMisc2bLensZoomPosition(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 do not support this tag std::string model = pos->toString(); for (auto& m : {"SLT-", "HV", "ILCA-"}) { if (model.find(m) != std::string::npos) return os << N_("n/a"); } os << std::round(value.toInt64() / 10.24) << "%"; return os; } std::ostream& SonyMakerNote::printSonyMisc2bFocusPosition2(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 do not support this tag std::string model = pos->toString(); for (auto& m : {"SLT-", "HV", "ILCA-"}) { if (model.find(m) != std::string::npos) return os << N_("n/a"); } 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"), IfdId::sonyMisc3cId, SectionId::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"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedLong, -1, printSonyMisc3cShotNumberSincePowerUp}, {18, "SequenceImageNumber", N_("Sequence image number"), N_("Number of images captured in burst sequence"), IfdId::sonyMisc3cId, SectionId::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"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength1)}, {26, "SequenceFileNumber", N_("Sequence file number"), N_("File number in burst sequence"), IfdId::sonyMisc3cId, SectionId::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"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength2)}, {41, "CameraOrientation", N_("Camera orientation"), N_("Orientation of the camera when the photo was taken"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cCameraOrientation)}, {42, "Quality2", N_("Quality 2"), N_("Quality 2"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, printSonyMisc3cQuality2}, {71, "SonyImageHeight", N_("Sony image height"), N_("Height of the image"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedShort, -1, printSonyMisc3cSonyImageHeight}, {83, "ModelReleaseYear", N_("Model release year"), N_("Year that the model of camera was released"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, printSonyMisc3cModelReleaseYear}, // End of list marker {0xffff, "(UnknownSonyMisc3c)", "(Unknown SonyMisc3c Tag)", N_("Unknown SonyMisc23 tag"), IfdId::sonyMisc3cId, SectionId::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 auto models = std::array{ "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", }; bool f = std::find(models.begin(), models.end(), pos->toString()) != models.end(); if (f) return os << value.toInt64(); 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.toInt64() + 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 << ")"; const auto val = value.toInt64(); 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 << ")"; // Models that do not support this tag const auto models = std::array{"ILCE-1", "ILCE-7SM3", "ILME-FX3"}; bool f = std::find(models.begin(), models.end(), pos->toString()) != models.end(); if (f) return os << N_("n/a"); const auto val = value.toInt64(); 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 << ")"; // Models that do not support this tag const auto models = std::array{"ILCE-1", "ILCE-7SM3", "ILME-FX3"}; bool f = std::find(models.begin(), models.end(), pos->toString()) != models.end(); if (f) return os << N_("n/a"); const auto val = value.toInt64(); if (val > 99) return os << "(" << val << ")"; if (val == 0) return os << "2000"; return os << "20" << val; } //! Sony SInfo1 tags (ShotInfo - Tag 3000) constexpr TagInfo SonyMakerNote::tagInfoSonySInfo1_[] = { // TODO: As "FaceInfo1" (72) and "FaceInfo2" (94) are not added, including // "FaceInfoOffset" (2) and "FaceInfoLength" (50) does not make sense. // The values are all connected and changing one without the rest will // corrupt the data. {6, "SonyDateTime", N_("Sony date/time"), N_("Date and time when the photo was captured"), IfdId::sonySInfo1Id, SectionId::makerTags, asciiString, -1, printValue}, {26, "SonyImageHeight", N_("Sony image height"), N_("Height of the image"), IfdId::sonySInfo1Id, SectionId::makerTags, unsignedShort, -1, printValue}, {28, "SonyImageWidth", N_("Sony image width"), N_("Width of the image"), IfdId::sonySInfo1Id, SectionId::makerTags, unsignedShort, -1, printValue}, {48, "FacesDetected", N_("Faces detected"), N_("Number of faces detected in the image"), IfdId::sonySInfo1Id, SectionId::makerTags, unsignedShort, -1, printValue}, {52, "MetaVersion", N_("Meta version"), N_("Sony meta version"), IfdId::sonySInfo1Id, SectionId::makerTags, asciiString, -1, printValue}, // TODO: Add FaceInfo1 (72) and FaceInfo2 (94) which are sub-groups of tags. // End of list marker {0xffff, "(UnknownsonySInfo1Tag)", "(Unknown SonySInfo1 Tag)", "(Unknown SonySInfo1 Tag)", IfdId::sonySInfo1Id, SectionId::makerTags, unsignedByte, -1, printValue}}; const TagInfo* SonyMakerNote::tagListSonySInfo1() { return tagInfoSonySInfo1_; } //! Sony Tag 2010 Sony2010 (Miscellaneous) constexpr TagInfo SonyMakerNote::tagInfo2010e_[] = { {0, "SequenceImageNumber", N_("Sequence Image Number"), N_("Sequence Image Number"), IfdId::sony2010eId, SectionId::makerTags, unsignedLong, 1, printValue}, {4, "SequenceFileNumber", N_("SequenceFileNumber"), N_("SequenceFileNumber"), IfdId::sony2010eId, SectionId::makerTags, unsignedLong, 1, printValue}, {8, "ReleaseMode2", N_("ReleaseMode2"), N_("ReleaseMode2"), IfdId::sony2010eId, SectionId::makerTags, unsignedLong, 1, printValue}, {540, "DigitalZoomRatio", N_("DigitalZoomRatio"), N_("DigitalZoomRatio"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {556, "SonyDateTime", N_("SonyDateTime"), N_("SonyDateTime"), IfdId::sony2010eId, SectionId::makerTags, undefined, 1, printValue}, {808, "DynamicRangeOptimizer", N_("DynamicRangeOptimizer"), N_("DynamicRangeOptimizer"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {1208, "MeterInfo", N_("MeterInfo"), N_("MeterInfo"), IfdId::sony2010eId, SectionId::makerTags, undefined, 1, printValue}, {4444, "ReleaseMode3", N_("ReleaseMode3"), N_("ReleaseMode3"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4448, "ReleaseMode2", N_("ReleaseMode2"), N_("ReleaseMode2"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4456, "SelfTimer", N_("SelfTimer"), N_("SelfTimer"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4460, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4466, "StopsAboveBaseISO", N_("StopsAboveBaseISO"), N_("StopsAboveBaseISO"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {4468, "BrightnessValue", N_("BrightnessValue"), N_("BrightnessValue"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {4472, "DynamicRangeOptimizer", N_("DynamicRangeOptimizer"), N_("DynamicRangeOptimizer"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4476, "HDRSetting", N_("HDRSetting"), N_("HDRSetting"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4480, "ExposureCompensation", N_("ExposureCompensation"), N_("ExposureCompensation"), IfdId::sony2010eId, SectionId::makerTags, signedShort, 1, printValue}, {4502, "PictureProfile", N_("PictureProfile"), N_("PictureProfile"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4503, "PictureProfile2", N_("PictureProfile2"), N_("PictureProfile2"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4507, "PictureEffect2", N_("PictureEffect2"), N_("PictureEffect2"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4520, "Quality2", N_("Quality2"), N_("Quality2"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4524, "MeteringMode", N_("MeteringMode"), N_("MeteringMode"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4525, "ExposureProgram", N_("ExposureProgram"), N_("ExposureProgram"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {4532, "WB_RGBLevels", N_("WB_RGBLevels"), N_("WB_RGBLevels"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 3, printValue}, {4692, "SonyISO", N_("SonyISO"), N_("SonyISO"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {4696, "SonyISO2", N_("SonyISO2"), N_("SonyISO2"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {4728, "FocalLength", N_("FocalLength"), N_("FocalLength"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {4730, "MinFocalLength", N_("MinFocalLength"), N_("MinFocalLength"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {4732, "MaxFocalLength", N_("MaxFocalLength"), N_("MaxFocalLength"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {4736, "SonyISO3", N_("SonyISO3"), N_("SonyISO3"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {6256, "DistortionCorrParams", N_("DistortionCorrParams"), N_("DistortionCorrParams"), IfdId::sony2010eId, SectionId::makerTags, signedShort, 16, printValue}, {6289, "LensFormat", N_("LensFormat"), N_("LensFormat"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {6290, "LensMount", N_("LensMount"), N_("LensMount"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {6291, "LensType2", N_("LensType2"), N_("LensType2"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {6294, "LensType", N_("LensType"), N_("LensType"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, {6296, "DistortionCorrParamsPresent", N_("DistortionCorrParamsPresent"), N_("DistortionCorrParamsPresent"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {6297, "DistortionCorrParamsNumber", N_("DistortionCorrParamsNumber"), N_("DistortionCorrParamsNumber"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, // End of list marker {0xffff, "(UnknownSony2010eTag)", "(UnknownSony2010eTag)", "(UnknownSony2010eTag)", IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* SonyMakerNote::tagList2010e() { return tagInfo2010e_; } // https://github.com/Exiv2/exiv2/pull/906#issuecomment-504338797 static DataBuf sonyTagCipher(uint16_t /* tag */, const byte* bytes, size_t size, TiffComponent* /*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.write_uint8(i, code[bytes[i]]); } return b; } DataBuf sonyTagDecipher(uint16_t tag, const byte* bytes, size_t size, TiffComponent* object) { return sonyTagCipher(tag, bytes, size, object, true); } DataBuf sonyTagEncipher(uint16_t tag, const byte* bytes, size_t size, TiffComponent* object) { return sonyTagCipher(tag, bytes, size, object, false); } } // namespace Exiv2::Internal